php
  • mysql
  • sql
  • 2012-12-22 111 views 1 likes 
    1

    無論我改變什麼,我都會繼續運行此代碼並獲取相同的錯誤。SQL錯誤檢索數據

    require('common.php'); 
    $charname = $_SESSION['user']['username']; 
    $query = "SELECT group, guild, username, class, level 
         FROM DD_users 
         WHERE username = '".$charname."'"; 
    try 
    { 
    // These two statements run the query against your database table. 
    $stmt = $db->prepare($query); 
    $stmt->execute(); 
    } 
    catch(PDOException $ex) 
    { 
    // Note: On a production website, you should not output $ex->getMessage(). 
    // It may provide an attacker with helpful information about your code. 
    die("Failed to run query: " . $ex->getMessage()); 
    } 
    
    // Finally, we can retrieve all of the found rows into an array using fetchAll 
    $rows = $stmt->fetchAll(); 
    
    //print_r($rows); 
    $group = $rows['0']['adminaccess']; 
    $guild = $rows['0']['guild']; 
    $username = $rows['0']['username']; 
    $class = $rows['0']['class']; 
    $level = $rows['0']['level']; 
    

    它返回該錯誤
    SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'group, guild, username, class, level FROM DD_users ' at line 1 而且很顯然,我需要更多的文字可以編輯這個...

    +0

    如果您打算構建像這樣的查詢,那麼不要浪費資源來使用預處理語句,只需要使用'$ db-> query()'。更不用說,通過使用佔位符的準備語句,您實際上可以防止您在嘗試自行構造查詢字符串時可能面臨的一些嚴重安全問題。 – brezanac

    +0

    我誠實地從登錄指南得到這個。你說我現在的代碼更安全,然後只是執行'$ db-> query()'?如果是這樣,那麼我認爲使用一點資源會降低安全性會更好。我的意思是,它只會是一個非常小的網站,無論如何都是電腦文盲,因此無論如何別人會試圖破解它。 – Matt

    +1

    不是因爲你正在使用'prepare()',而是你沒有使用它實際上應該使用的東西。如果你有簡單的查詢,不需要使用'$ charname'等外部參數,你可以使用query(),但是如果你需要提供參數,你應該通過'bindParam()'使用參數綁定,或者直接提供參數爲一個數組到'execute()'。長話短說有人已經回答了這個問題,同時提供了一個關於我想說的話的例子。 – brezanac

    回答

    4

    試試這個:

    $query = "SELECT group, guild, username, class, level FROM DD_users WHERE username = '".$charname."'";

    注意額外報價'。如果您查詢字符串,則它們是必需的。

    另外:group可能是一個保留關鍵字。您需要使用`-style quotes或.brackets [來逃避。嘗試它的工作原理

    +0

    這工作。謝謝。我會選擇它,如果可以的話,我會回答。 – Matt

    +0

    很高興有幫助 – mindandmedia

    3

    關注,該集團的關鍵字被保留,試圖封閉它反引號`

    +0

    我改變了列名。我不知道有保留字。其中一些也有意義。 – Matt

    5

    你忘了'字符:

    $query = "SELECT group, guild, username, class, level 
          FROM DD_users 
          WHERE username = '".$charname."'"; 
    
    1

    像下面這樣將節省你的單引號的麻煩 - 但更重要的是它還可以防範SQL注入攻擊。你從來沒有想要輸入並將其直接推入SQL查詢字符串。可怕的事情會發生。

    請注意查詢字符串中的?標記,並通過$charname值來代替?通過execute(array($charname))調用。這樣做的事情會讓底層庫代碼在查詢中安全地引用$ charname。

    require('common.php'); 
    $charname = $_SESSION['user']['username']; 
    $query = "SELECT `group`, guild, username, class, level 
          FROM DD_users 
          WHERE username = ?"; 
    try 
    { 
        // These two statements run the query against your database table. 
        $stmt = $db->prepare($query); 
        $stmt->execute(array($charname)); 
    } 
    catch(PDOException $ex) 
    { 
        // Note: On a production website, you should not output $ex->getMessage(). 
        // It may provide an attacker with helpful information about your code. 
        die("Failed to run query: " . $ex->getMessage()); 
    } 
    
    // Finally, we can retrieve all of the found rows into an array using fetchAll 
    $rows = $stmt->fetchAll(); 
    
    print_r($rows); 
    
    +0

    我將我的第一篇文章更新爲我現在的文章。當我使用你的代碼時,我得到和以前一樣的錯誤。 – Matt

    +1

    'group'是一個sql關鍵字。我添加了反引號來引用它作爲標識符。試試我更新的代碼!希望這對你有用。沒有這些反引號,你會得到語法錯誤。 – DWright

    +0

    這和我忘了在腳本中改變它。一切都很好。感謝指針。 – Matt

    相關問題