2016-07-23 2 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 строит запрос inline с цитированными строками. ; -/ –

ответ

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(); 
Смежные вопросы