2016-11-07 44 views
-1

我的PHP函數不工作,我找不到原因,它拋出「調用成員函數execute()on布爾「錯誤在我的臉上,誰能告訴我我做錯了什麼?PHP調用成員函數execute()布爾值,找不到有什麼問題

$projectName = $_POST['project_name']; 

$getProjectId = $mysqli->prepare('SELECT project_id FROM projects WHERE project_name = '.$projectName); 
$getProjectId->execute(); 
$getProjectId->bind_result($projectId); 
$_SESSION['projectID'] = $projectId; 

是的,數據庫連接是好的,它可以在其他功能。

+1

你的查詢失敗了,你需要爲你的projectName引用 – Mihai

+2

你的prepare語句失敗。因爲錯誤而不是盲目地假設它有效,我猜這是因爲你不是配額ng你的projectName。由於您使用的是mysqli和準備好的語句,因此請使用bind_param來防止SQL注入並正確傳遞值。 – aynber

+0

您正在使用準備好的語句(很好!),但再多走一步並使用[綁定參數](http://php.net/manual/en/mysqli-stmt.bind-param.php)來避免類似問題這使得你的代碼更加安全 – dan08

回答

1

$mysqli->prepare返回false當查詢包含錯誤時。您應該在prepare語句後面檢查$mysqli->error$mysqli->errno,以確定查詢出了什麼問題。

+1

雖然這不是一個完全的答案,但檢查錯誤日誌是一種很好的做法 – Martin

2

你做錯了。

使用Prepared Statements的整點(以及其中一個主要參數)是您設置語句,然後單獨插入變量,以便變量永遠不會對SQL語句構成風險。

你的SQL查詢:

$getProjectId = $mysqli->prepare('SELECT project_id FROM projects 
       WHERE project_name = '.$projectName); 

什麼,你現在在這裏是它的形狀就好像它是一個標準的非準備老式的MySQLi語句準備好的聲明。這意味着變量$projectName可以包含任何數據,並可以直接濫用您的SQL查詢。

你需要做的,而不是什麼是替代變量佔位符,然後再添加變量,這就是所謂的準備的SQL,有#2的指導和互聯網的LOT在逃這樣做這一點,所以請,請研究,但結局會是這樣的:

$getProjectId = $mysqli->prepare("SELECT project_id FROM projects 
        WHERE project_name = ?"); 
    $getProjectId->bind_param("s",$projectName); 
    $getProjectId->execute(); 

    //carry on as before 

bind_param代碼插入了可變進?佔位符的位置,完全避免了SQL注入的問題。

回答你的問題

MySQL使用反引號

` <== This, typically next to the number 1 on your keyboard 

,並使用單引號',所以當你在一個SQL字符串列名和/或參考值的名字,他們將在一個被包裹單引號。如果用PHP中的單引號將整個字符串包裝在一起,這會導致您的問題。這是你在這裏遇到的錯誤。

原始查詢:

'SELECT project_id FROM projects WHERE project_name = '.$projectName 

應該是(忽略上述細節,那就是真的應該妥善準備):

"SELECT project_id FROM projects WHERE project_name = '$projectName' " 

我希望你能注意到字符串現在用雙引號括起來,列值用單引號括起來。

Aslo,如djxyz和Aynbar在註釋中所述,您應該考慮獲取錯誤反饋,以便MySQL可以告訴您爲什麼查詢不起作用,錯誤消息在MySQL和PHP中都非常有用。

在結論

正確使用預處理語句

否定了你原本與列名在引號中的主要語法錯誤(不需要的,如果它是一個佔位符?)。總是習慣於使用雙引號"編寫SQL字符串來回避這類問題。

最後,千萬要小心,因爲PDOMySQLi有稍微不同的語法編寫的(所以當你正在閱讀SO帖子,嘗試建立如果代碼是MySQLiPDO複製之前!

正確使用預處理語句將會使你的編碼能力發生奇蹟,同時也會讓你的代碼更安全,並且它可以偶爾幫助你在聚會中混合起來

相關問題