你做錯了。
使用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字符串來回避這類問題。
最後,千萬要小心,因爲PDO
和MySQLi
有稍微不同的語法編寫的(所以當你正在閱讀SO帖子,嘗試建立如果代碼是MySQLi
或PDO
複製之前!
正確使用預處理語句將會使你的編碼能力發生奇蹟,同時也會讓你的代碼更安全,並且它可以偶爾幫助你在聚會中混合起來
你的查詢失敗了,你需要爲你的projectName引用 – Mihai
你的prepare語句失敗。因爲錯誤而不是盲目地假設它有效,我猜這是因爲你不是配額ng你的projectName。由於您使用的是mysqli和準備好的語句,因此請使用bind_param來防止SQL注入並正確傳遞值。 – aynber
您正在使用準備好的語句(很好!),但再多走一步並使用[綁定參數](http://php.net/manual/en/mysqli-stmt.bind-param.php)來避免類似問題這使得你的代碼更加安全 – dan08