日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > php >内容正文

php

php发送sql,php发送Sql语句遇到的坑

發布時間:2025/3/20 php 13 豆豆
生活随笔 收集整理的這篇文章主要介紹了 php发送sql,php发送Sql语句遇到的坑 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

php發送Sql語句遇到的坑

標簽: php

先在這里貼一下代碼:

//連接數據庫

$link = mysqli_connect('127.0.0.1','root','') or die('連接失敗!');

//設置字符串編碼

mysqli_query($link,"set names utf8");

//選擇數據庫

//session_start();

mysqli_select_db($link,'user');

//獲取表單數據

//對密碼進行MD5加密

$username = $_POST['username'];

$password = md5($_POST['userword']);

//檢測用戶名及密碼是否正確,執行sql查詢

$check_query = "select * from user where userName = {$username}";

$result = mysqli_query($link,$check_query);

//獲取記錄數

//取得結果集中行的數目

$num = mysqli_num_rows($result);

echo $num;

// 用戶存在

if($num){

/*

mysql_fetch_array從結果集中取得一行作為關聯數組,或數字數組,或二者兼有

*/

$row=mysql_fetch_array($result);

//對密碼進行判斷

if($password===$row['userPassword']){

echo "登陸成功!";

//header() 函數向客戶端發送原始的 HTTP 報頭。

//header("location:index.php");

}else{

echo "密碼不正確";

//echo "返回登陸頁面";

}

}else{

echo "用戶不存在";

//echo "返回登陸頁面";

}

?>

作為一個php小白,寫了40行代碼,挖了不少坑,大家可以借助一下這段代碼檢驗一下自己的水平,哈哈哈哈哈。

下面講述的步驟,是我在逐漸解決的過程。

坑一: mysql_num_rows()

報的第一個錯誤是關于mysql_num_rows()的

mysql_num_rows() expects mysqli_result 1 to be resource,boolean given

這個報錯字面意思是這個函數的參數應該接受一個resource的參數,但實際運行時,傳進去的參數是一個布爾值。 作為一個學習的心態,還是應該先找一下關于這個函數的解釋:

用法:int mysql_num_rows ( resource $result )

mysql_num_rows() 返回結果集中行的數目。此命令僅對 SELECT 語句有效。要取得被 INSERT,UPDATE 或者 DELETE 查詢所影響到的行的數目,用 mysql_affected_rows()。

在我的代碼中,$result是查詢后的結果,我的代碼應該看起來沒有問題,而錯誤提示$result是一個布爾值,可能是我的查詢語句出現了問題。

坑二:發送sql語句

現在php菜鳥教程中找了其返回值的情況:

針對成功的 SELECT、SHOW、DESCRIBE 或 EXPLAIN 查詢,將返回一個 mysqli_result 對象。針對其他成功的查詢,將返回 TRUE。如果失敗,則返回 FALSE

看到這里,看到mysqli_result對象感覺看到了家人。覺得頓時有了頭緒。 關于$link: 我在mysqli_query()中傳入的參數$link其實是不對的,這個資源標識符是我登錄數據庫時候返回的,而不是選擇數據時候返回的。而數據庫才是我操作的對象,其中的邏輯千萬要搞明白。

坑三:sql語句

最后的問題就是出在了這里。

先說一下php里的變量解析:

在單引號字符串中的變量和特殊含義的字符將不會被替換。 用雙引號定義的 字符串 最重要的特征是變量會被解析

第一種情況:

$name = 'lan';

echo '我是$name';

這在情況下,變量會被當作字符串處理,會輸出

我是$name

$name = 'lan';

echo "我是$name";

在這種情況下,變量會被解析,輸出:

我是lan

詳情參見玩轉php變量解析 2. php中的{} 在我查找php拼接字符串的過程中,主要出現了兩種方法,一個就是直接使用雙引號進行變量解析,另外一種是使用.符號進行拼接。 雙引號出現了一種寫法:{$username} 讓我有一些困惑,在這里也說一下其作用:

(1). 表示{}里面的是一個變量 ,執行時按照變量來處理 (2). 在字符串中引用變量使用的特殊包括方式,這樣就可以不使用.運算符,從而減少代碼的輸入量了 (3). 防止變量名和后面的字符串連在一起

使用.拼接sql語句 這是我在mysql的phpMyAdmin中自動生成的查詢語句

SELECT * FROM `user` WHERE `userName` LIKE 'lan'

而這是我在運行的過程中輸出的拼接后的字符串:

SELECT * FROM `user` WHERE `userName` LIKE lan

仔細一下觀察一下可以看出輸出的語句中最后lan是沒有單引號的,這就是錯誤的根源了,可憐我一直沒有看到。

最后拼接成了這個樣子:

$check_query = "SELECT * FROM `user` WHERE `userName` LIKE"."'".$username."'";

坑四:md5

md5() 函數計算字符串的 MD5 散列。主要用于加密.

調試到后面,前面的都能正確運行,但就是一直輸出密碼不對,想到,也許從數據庫里讀取的數據,也要進行md5處理才能和進過md5處理的密碼比較,一試,果然對了。 其實可以在一開始注冊的時候,就把密碼md5加密儲存在數據中。

總結

是時候好好看看調試方法了

總結

以上是生活随笔為你收集整理的php发送sql,php发送Sql语句遇到的坑的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。