2016-07-23 21 views
4

我在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(); 

這工作,但有什麼辦法,我沒有與真正準備好的發言兩次聲明相同的變量?我有很多這些查詢,並希望將它們全部替換爲使用準備好的語句。

正如有人在評論中提出的那樣:爲什麼我要關閉仿真?我並沒有真正的偏好,但現在看起來,準備好的陳述比模擬的陳述更嚴格。我的理解是否正確,最好是用真實的準備語句來發展,以保證它能夠同時適用於這兩種設置?

+1

有沒有辦法來解決這個,我知道。你爲什麼不想用仿真? – bassxzero

+1

我之前沒有任何理由,但現在我遇到了這個問題,我這樣做:兼容這兩個設置。正如你可以從我的問題看到的,改變設置打破了我的代碼。真準備語句的代碼適用於這兩種設置。 – Max

+1

佔位符名稱必須是唯一的。請記住,對於mysql,所有的名字變成'?'作爲佔位符。即':team_id1'和':team_id2'。無論什麼原因,如果您使用相同的佔位符名稱,它不起作用。模擬模式不同於PDO使用帶引號的字符串內聯查詢。 ; -/ –

回答

1

有一種方法通過改變查詢

$query=$db_con->prepare('SELECT*FROM matches WHERE :team_id in(home_team_id,away_team_id)'); 
$query->bindValue(':team_id', $team_id, PDO::PARAM_STR); 
$query->execute(); 

,這可能不是理想的,但它在一次的情況下聲明變量。

希望這有用。

+0

您是否嘗試過使用模擬語句關閉? – Max

+0

編輯後仍然懷疑。爲什麼這個代碼是一個解決方案,如果它不適用於仿真關閉?爲什麼我應該在數組中放入一個變量?你能解釋一下你的代碼是做什麼的,或者爲什麼它比問題中的代碼更好?我不打算打破你的答案,我試圖理解爲什麼你認爲這是一個解決方案。我感謝你迄今爲止的努力:) – Max

1

一個簡單的解決方案是使用計數器。通過這種方式,您可以保留emulation off,並且仍然多次綁定相同的值,而無需統計您使用過多少次,或者在更改查詢時重新編號。

$count=0; 
$query = $db_con->prepare(
    'SELECT * FROM matches WHERE 
    matches.home_team_id=:team_id'.(++$count).' OR 
    matches.away_team_id=:team_id'.(++$count) 
    ); 
for($i=1; $i<($count+1) ;++$i){ 
    $query->bindValue(':team_id'.$i, $team_id, PDO::PARAM_STR); 
    } 
$query->execute(); 
return $query->fetchAll();