2016-02-07 3 views
-1

Несколько дней назад у меня была эта проблема с bind_param, и я нашел временное решение, но это нехорошо. Мне нужно динамически связывать переменные при регистрации пользователя, поэтому я использую это с запросом INSERT INTO. В начале я думал, что это может быть потому, что я должен был передать значение по ссылке, но поскольку я читал на php.net, поскольку php 5.3 вам больше не нужно передавать значение по ссылке. Так что я пытался, пытался и пытался, но не могу понять, где я ошибаюсь.bind_param не работает со значениями

// INSERT INTO 
public function QueryInsert($table, $fields, $values, $format) { 
    $values = explode(',',$values); // Metto i VALUES di Insert in un array   
    $placeholders = ""; // Inizializzo Segnaposto 
    $data = ""; 
    $i = 0; 
    foreach($values as $k => $v) { // Creo i placeholders in base al numero di Valori VALUES 
     $placeholders .= '?,';    
    }      
    $placeholders = substr($placeholders, 0, -1); // Tolgo l'ultima virgola 

    $DB = DBConn::ConnettiDB(); // Richiamo la funzione di connessione al DB   
    $statem = $DB->prepare("INSERT INTO $table($fields) VALUES ($placeholders)"); // Preparo query per inserimento          

    $statem->bind_param("$format",$values); // WORKING 
    $statem->execute(); // Eseguo query INSERT   
    // Controllo se la query INSERT ha avuto successo 
    if($statem->affected_rows != -1) {   
     return true; 
    }   
    echo "<br>ERRORE Insert: <br>" . $statem->error; 

} // FINE INSERT 

Я сделал эту работу, заменив этот

$statem->bind_param("$format",$values); // WORKING 

с этим

$statem->bind_param("$format",$values[0],$values[1],$values[2]); // WORKING 

начиная с $ значений массива производится с регистрационными полями, так, чтобы добавить пользователя я иметь имя пользователя , пароль и адрес электронной почты, 3 поля, таким образом, он работает. Проблема в том, что я не могу использовать этот скрипт для запуска динамических запросов, потому что он не работает с строкой, я сказал, с переменными значениями $, которые являются массивом, и я не понимаю, почему bind_param этого не принимает. Infact ошибки я получаю:

No data supplied for parameters in prepared statement 

Потому что кажется, что bind_param не может работать с этими переменными $ значения

Я попытался с call_user_function_array тоже, но не сделать его работать. Может кто-нибудь сказать мне, где я терпеть неудачу? Может быть, это значение ценности ref? Потому что я не уверен, так как я читал, что теперь вам больше не нужно передавать значения по ссылке. И я тоже пытался это сделать, это не сработало, может быть, я не сделал правильного пути.

+2

Согласно документации (http://php.net/manual/es/mysqli-stmt.bind-param.php), вы должны пройти каждое значение, а не массив из них. Вы можете использовать произвольное количество значений, используя 'call_user_func_array', проверьте этот вопрос: http://stackoverflow.com/questions/16236395/bind-param-with-array-of-parameters –

+1

Возможный дубликат [Использовать одно связывание \ _param() с переменным числом входных варов] (http://stackoverflow.com/questions/793471/use-one-bind-param-with-variable-number-of-input-vars) – Gavriel

+0

Завтра я буду выглядеть лучше с тех пор Я устал, но я уже пробовал с CUFA, и теперь я тоже это пробовал, и он никогда не работал. Я действительно не понимаю, в чем проблема, 100% - это ценности, но даже если я передам их как ссылку, это не работа ... это на самом деле сводит меня с ума. Спасибо за помощь – eartahhj

ответ

0

Две возможности. Один, как упоминается в комментариях, использует call_user_func_array(), что позволяет передавать массив аргументов любой функции. EDIT: Согласно this answer, использование call_user_func_array() с bind_param() сложно.

array_unshift($values, $format); 
$statem = $DB->prepare("INSERT INTO $table($fields) VALUES ($placeholders)"); 
call_user_func_array(
    array($statem, "bind_param"), 
    refValues($values) 
); 
$statem->execute(); 

function refValues($arr){ 
    $refs = array(); 
    foreach($arr as $key => $value) 
     $refs[$key] = &$arr[$key]; 
    return $refs; 
} 

Другой может быть больше работы, но стоит исследовать; вам нужно изменить свой объект базы данных на PDO вместо mysqli. Но тогда вы можете это сделать, потому что PDO не имеет привязки необходимых переменных.

$statem = $DB->prepare("INSERT INTO $table($fields) VALUES ($placeholders)"); 
$statem->execute($values); 
if($statem->rowCount() > 0) { 
    return true; 
} 
+0

Я также попробовал снова с Call User Fun Array, но я не могу сделать эту работу ... Я не знаю, является ли это проблемой моего хоста или что-то еще ... call_user_func_array (array ($ statem, "bind_param"), array_merge ($ формат, $ значения)); – eartahhj

+0

Я не думаю, что PHP сказал: «Я не могу сделать эту работу!» Какие ошибки вы получаете? Также добавьте некоторые проверки к результатам для подготовки, привязки и выполнения оператора. – miken32

+0

Я уже отправил ошибку, это «Нет данных для параметров в подготовленном сообщении». Я пробовал разные версии вызова func fun user Как будто он не мог получить доступ к параметрам массива, я думал, что это для ссылки, но даже если я передам им ссылочную функцию, ошибка будет такой же. Проблема заключается в значениях массива $, и я не могу понять, почему, я пробовал это как 3 дня, и я пробовал все, что мог, но это делает меня сумасшедшим по-настоящему. Пока это работает, только когда я делаю эту строку: $ statem-> bind_param («$ format», $ values ​​[0], $ values ​​[1], $ values ​​[2]) Вот почему, возможно, есть ссылка – eartahhj

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