php發送Sql語句遇到的坑

php發送Sql語句遇到的坑

標籤: phpphp


先在這裏貼一下代碼:html

<?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 "<a href='login.php'>返回登錄頁面</a>";
        } 
    }else{
        echo "用戶不存在";
        //echo "<a href='login.php'>返回登錄頁面</a>";
    }
?>

做爲一個php小白,寫了40行代碼,挖了很多坑,你們能夠藉助一下這段代碼檢驗一下本身的水平,哈哈哈哈哈。
下面講述的步驟,是我在逐漸解決的過程。mysql

坑一: mysql_num_rows()

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

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()。session

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

坑二:發送sql語句

如今php菜鳥教程中找了其返回值的狀況:學習

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

看到這裏,看到mysqli_result對象感受看到了家人。以爲頓時有了頭緒。
關於$link:
我在mysqli_query()中傳入的參數$link實際上是不對的,這個資源標識符是我登陸數據庫時候返回的,而不是選擇數據時候返回的。而數據庫纔是我操做的對象,其中的邏輯千萬要搞明白。fetch

坑三:sql語句

最後的問題就是出在了這裏。

  1. 先說一下php裏的變量解析:

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

第一種狀況:

$name = 'lan';
echo '我是$name';

這在狀況下,變量會被看成字符串處理,會輸出

我是$name

$name = 'lan';
echo "我是$name";

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

我是lan

詳情參見玩轉php變量解析

  1. php中的{}

    在我查找php拼接字符串的過程當中,主要出現了兩種方法,一個就是直接使用雙引號進行變量解析,另一種是使用.符號進行拼接。

    雙引號出現了一種寫法:{$username} 讓我有一些困惑,在這裏也說一下其做用:

(1). 表示{}裏面的是一個變量 ,執行時按照變量來處理

(2). 在字符串中引用變量使用的特殊包括方式,這樣就能夠不使用.運算符,從而減小代碼的輸入量了
(3). 防止變量名和後面的字符串連在一塊兒

  1. 使用.拼接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加密儲存在數據中。

總結

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

相關文章
相關標籤/搜索