我在PHP7中有以下幾行代碼。我正在使用PDO連接到MySQL。PDO模擬關閉,多次綁定相同的值
隨着PDO準備上,此代碼的工作成功的語句仿真:
$query = $db_con->prepare('SELECT * FROM matches WHERE matches.home_team_id=:team_id OR matches.away_team_id=:team_id');
$query->bindValue(':team_id', $team_id, PDO::PARAM_STR);
$query->execute();
return $query->fetchAll();
但與真正的PDO預處理語句(仿真關閉),前面的代碼給出了沒有足夠的值約束錯誤。我不得不做到以下幾點:
$query = $db_con->prepare('SELECT * FROM matches WHERE matches.home_team_id=:team_id OR matches.away_team_id=:team_id2');
$query->bindValue(':team_id', $team_id, PDO::PARAM_STR);
$query->bindValue(':team_id2', $team_id, PDO::PARAM_STR);
$query->execute();
return $query->fetchAll();
這工作,但有什麼辦法,我沒有與真正準備好的發言兩次聲明相同的變量?我有很多這些查詢,並希望將它們全部替換爲使用準備好的語句。
正如有人在評論中提出的那樣:爲什麼我要關閉仿真?我並沒有真正的偏好,但現在看起來,準備好的陳述比模擬的陳述更嚴格。我的理解是否正確,最好是用真實的準備語句來發展,以保證它能夠同時適用於這兩種設置?
有沒有辦法來解決這個,我知道。你爲什麼不想用仿真? – bassxzero
我之前沒有任何理由,但現在我遇到了這個問題,我這樣做:兼容這兩個設置。正如你可以從我的問題看到的,改變設置打破了我的代碼。真準備語句的代碼適用於這兩種設置。 – Max
佔位符名稱必須是唯一的。請記住,對於mysql,所有的名字變成'?'作爲佔位符。即':team_id1'和':team_id2'。無論什麼原因,如果您使用相同的佔位符名稱,它不起作用。模擬模式不同於PDO使用帶引號的字符串內聯查詢。 ; -/ –