Я пытаюсь построить подготовленный оператор динамически, и я продолжаю получать следующую ошибку:
mysqli_stmt_bind_param(): Number of elements in type definition string doesn't match number of bind variables in
Когда я повторяю свои утверждения, количество определений типов соответствует переменной привязки, поэтому я не знаю, что не так. Я думаю, что мой код может передавать строки, кавычки или что-то вместо переменных, но я новичок в подготовленном заявлении и не знаю, как проверить мой запрос. При использовании простой mysqli_query
я могу повторить запрос и посмотреть, была ли моя ошибка. Я не уверен, как это сделать с подготовленными заявлениями, поэтому я надеюсь, что кто-то поможет мне разобраться с моей ошибкой.
Я пытаюсь построить инструкцию для подготовки динамически, чтобы я мог повторно использовать код следующим образом:
$db = mysqli_stmt_init($dbconnection); //i have looped through my fields and constructed a string that when echoed returns this: ?, ?, ?, ?, I use sub str just to remove the last comma and space leaving me with the string ?, ?, ?, ?. Ive echoed this to the browser to make sure it is correct. $preparedQs = substr($preparedQs, 0, -2); //I then loop through each field using their datatype and constructs the type string as follows ssss. Ive echoed this to the browser to make sure it is correct. $preparedType = 'ssss'; //I then loop through my post array verifying and cleaning the data and then it constructing a string of clean values that results in Mike, null, Smith, Sr., (First, Middle, Last, Suffix) I use substr again just to remove the last comma and space. Ive echoed this to the browser to make sure it is correct. $cleanstr = substr($cleanstr, 0, -2); //I then explode that string into a an array that I can loop through and assign/bind each value to a variable as follows and use substr again to remove last comma and space. $cleanstr = explode(", ", $cleanstr); $ct2 = 0; foreach ( $cleanstr as $cl){ $name = "a".$ct2; $$name = $cl; $varstr .= "$".$name.", "; $ct2 = $ct2 +1; } $varstr = substr($varstr, 0, -2); //ive echoed the $varstr to the browser and get $a1, $a2, $a3, $a4. I have also echo their value outside of the loop and know values have been assigned. //I then try to assign each step above the appropriate prepared statement place holder $stmt = mysqli_stmt_prepare($db, "INSERT INTO Contacts VALUES (". $preparedQs. ")"); mysqli_stmt_bind_param($db, "'".$preparedType."'", $varstr); mysqli_stmt_execute($stmt);
Я не уверен, что я делаю неправильно, потому что когда я эхо $preparedQs
, $preparedType
$varstr
и $varstr
у всех их есть одинаковое количество элементов, но я получаю «mysqli_stmt_bind_param (): Число элементов в строке определения типа doesn 't соответствует числу переменных привязки в .. ". Все, что я могу думать, это то, что у меня есть кавычки или что-то там, где я не должен, но я пытался добавлять и удалять кавычки в определенных областях и не могу решить эту проблему.
Кроме того, я прочитал несколько сообщений о передаче null в подготовленном операторе, но даже когда я заменяю нуль фактическим значением, я все равно получаю ту же ошибку.
Вероятно, стоит отметить, что при использовании простых процедурных mysqli_query
и mysqli_real_escape_string
для очистки моих данных все работает нормально. Я пытаюсь улучшить свою безопасность, преобразовывая мое приложение в подготовленный оператор просто для дополнительной безопасности.
// EDIT / DIFFERENT
Этот вопрос по-разному
Кто-нибудь поможет мне с процедурной вставкой для решения моей проблемы. Спасибо.