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语句遇到的坑的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql 数值 字符 优化,教你如何进
- 下一篇: ios 登录 java 后台,IOS苹果