2015-01-18 2 views
1

Мне нужно запустить запрос ниже. Он спрашивает у меня много неприятностей. На самом деле, у меня есть несколько условий «ГДЕ», которые требуют разложения массива.Mysqli подготовленный оператор: несколько предложений WHERE и WHERE IN (Array)

This issue помог мне, но у него нет нескольких условий «ГДЕ».

$array = (1,2,3,4,5,6,7,8,9,10); 

$clause = implode(',', array_fill(0, count($array), '?')); 

if($request = $this->getConnexion()->prepare('SELECT col1, col2 FROM table WHERE col1 IN ('.$clause.') AND col2>=?') or die(mysqli_error($this->getConnexion()))) { 

    // The problem starts here 
    call_user_func_array(array($request, 'bind_param'), $array); 

    $request->bind_param('i', $this->getTime()); 
    // Until here 

    $request->execute(); 
    $request->bind_result($col1, $col2); 
    $request->store_result(); 

    // Following the code 

} 
+0

Вы можете добавить свой '$ this-> GetTime()' до конца вашего массива, перед использованием 'call_user_func_array', или построить еще один' 'array_fill' с помощью i', а затем взрываются в' bind_param' – Sean

+2

В чем проблема? Похоже, что вместо дополнительного вызова 'bind_param()' вы должны добавить еще один '' 'в массив' $ clause' и добавить значение '$ this-> getTime()' в '$ array 'array значений, поэтому вы просто имеете дело с одним массивом параметров, охватывающим как предложение IN(), так и другое условие. –

+0

@Michael Berkowski, пожалуйста, напишите свой ответ, я не понимаю, о чем вы думаете :) – Zl3n

ответ

2

Важным здесь является то, что вы вызываете bind_param() только один раз, с массивом, содержащим все параметров вам нужно связать, поэтому ваше решение будет просто добавить дополнительный параметр WHERE дизъюнкцию на ваши $array значений для привязки. Предложение IN() не является особым случаем, требующим от call_user_func_array() от других параметров. Вы называете это всего из них.

Что-то не хватает, хотя - первый параметр - bind_param() - это строка типов данных. Все ваши типы: i, поэтому для его создания вам необходимо использовать str_repeat().

// Eventually, this array will contain the other params too 
$array = (1,2,3,4,5,6,7,8,9,10); 

// This creates a string of ?,?,?,?... for the IN() clause  
$clause = implode(',', array_fill(0, count($array), '?')); 

// Add the additional value onto the $array array 
// so the last param is bound with the others. 
$array[] = $this->getTime(); 

$types = str_repeat('i', count($array)); 

// The params passed to call_user_func_array() must have as references, each subsequent value. Add those in a loop, but start with the $types string 
$params = array($types); 
foreach ($array as $key => $value) { 
    $params[] = &$array[$key]; 
} 

if($request = $this->getConnexion()->prepare('SELECT col1, col2 FROM table WHERE col1 IN ('.$clause.') AND col2>=?') or die(mysqli_error($this->getConnexion()))) { 

    // Then bind_param() is called on all parameters 
    // using the $params array which includes types and param references 
    call_user_func_array(array($request, 'bind_param'), $params); 

    // Execute & fetch. 
    $request->execute(); 
    $request->bind_result($col1, $col2); 
    $request->store_result(); 

    // Following the code 
} 
+0

Какая глупость, я вообще об этом не думал! Спасибо. Я тестировал и подтверждаю ваш ответ – Zl3n

+1

@zlen Не глупость. MySQLi в сочетании с 'call_user_func_array()' действительно сложна. Я никогда не запомню, как это сделать, не глядя на него, и примеры нередко хорошо комментируются, чтобы понять, что на самом деле делается. –

+0

У меня есть эта ошибка: «Параметр 2 для mysqli_stmt :: bind_param() должен быть ссылкой:« Я нашел проблему выше, но это не отвечает мне: http://stackoverflow.com/questions/2045875/ pass-by-reference-problem-with-php-5-3-1 – Zl3n

Смежные вопросы