2013-06-25 2 views
0

Здесь работает заявление без ?MySQL REGEXP с? Заполнителей, как связать с переменной PHP

$query_select_all = "SELECT * FROM TableName WHERE CAST(ColumnName AS UNSIGNED) REGEXP '111|114|115'"; 
$sql = $db->prepare($query_select_all); 
$sql->execute(); 

Хотите использовать '111|114|115' в качестве переменной PHP (например $data).

Изменить код

$data = array('111|', '114|', '115'); 
$query_select_all = "SELECT * FROM TableName WHERE CAST(ColumnName AS UNSIGNED) REGEXP (?,?,?)"; 
$sql = $db->prepare($query_select_all); 
$sql->execute($data); 

$data выглядит Array ([0] => 111| [1] => 114| [2] => 115)

После выполнения заявления получить SQLSTATE[21000]: Cardinality violation: 1241 Operand should contain 1 column(s).

Предположим, что нечто не правильно с $data = array('111|', '114|', '115');

Что такое правильный код?

+0

Распечатайте весь запрос , Что такое '$ query_select_all_start'? – silkfire

+0

Один момент ... изменится в вопросе – user2360831

ответ

1

Это означает, что REGEXP ожидает только одного заполнителя, но вы даете ему три.

Изменить это:

$sql->execute($data); 

к:

$sql->execute(array('111|114|115')); 
+0

О, я глуп ... Да, он работает с одним? – user2360831

1

Даешь 3 Params в регулярном выражении в то время как он должен быть только один:

... REGEXP (?,?,?)"; 

Таким образом, вы, наконец, получить что-то вроде:

... REGEXP ('111|','114|','115')"; 

Кроме того, вместо добавления | полукокса некоторые из элементов массива, вы могли бы сделать что-то вроде этого:

$res = implode('|', $arr); 

А затем просто использовать связывание в вашем запросе один из параметров .: