2015-02-08 1 views
1

Я пытаюсь обновить свой сайт, чтобы использовать подготовленные инструкции, но я продолжаю получать эту ошибку, и я не могу понять, почему. Я искал Google и Stackoverflow в течение недели, пытаясь найти все, что я нашел, но ничто не устранило проблему. Я уверен, что я кое-что недооцениваю. Вот код, который выдает ошибку:Использование MySQLi подготовленных операторов в PHP, получение «Нет данных для параметров в подготовленном сообщении»

$query = "INSERT INTO `$table` (type, name, company, amount, currentbalance, interest, startingbalance, term, frequency, entrymonth, entryyear, notes) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"; 

echo "Preparing query..."; 
$addstmt = $db->prepare($query); 
echo "(" . $addstmt->errno . ") " . $addstmt->error; 
echo "<br>Binding params..."; 
$addstmt->bind_param('s', empty($type) ? "income" : $type); 
$addstmt->bind_param('s', empty($name) ? "" : $name); 
$addstmt->bind_param('s', empty($company) ? "" : $company); 
$addstmt->bind_param('d', empty($amount) ? 0.0 : $amount); 
$addstmt->bind_param('d', empty($currentbalance) ? 0.0 : $currentbalance); 
$addstmt->bind_param('d', empty($interest) ? 0.0 : $interest); 
$addstmt->bind_param('d', empty($startingbalance) ? 0.0 : $startingbalance); 
$addstmt->bind_param('i', empty($term) ? 0 : $term); 
$addstmt->bind_param('i', empty($freq) ? 4 : $freq); 
$addstmt->bind_param('i', empty($month) ? 0 : $month); 
$addstmt->bind_param('i', empty($year) ? 2015 : $year); 
$addstmt->bind_param('s', empty($notes) ? "" : $notes); 
echo "(" . $addstmt->errno . ") " . $addstmt->error; 
echo "<br>Executing statement..."; 
$result = $addstmt->execute(); 
echo "(" . $addstmt->errno . ") " . $addstmt->error; 

Этот код выводит следующее:

Preparing query...(0) 
Binding params...(0) 
Executing statement...(2031) No data supplied for parameters in prepared statement 

И очевидно, ничего не вставляется в базу данных. Пожалуйста, помогите мне понять, что я делаю неправильно. Спасибо всем заранее.

Eric

+0

Сначала установите тройные операторы для своих переменных, затем 'bind_param()' один раз, как утверждает Бармар в своем ответе. –

ответ

2

Вы не называйте bind_param повторно для каждого параметра, вы называете это один раз со всеми параметрами.

$addstmt->bind_param('sssddddiiiis', $type, $name, $company, $amount, $currentbalance, $interest, $startingbalance, $term, $freq, $month, $year, $notes); 

Вы также не можете использовать выражения в аргументах. Параметры привязаны к ссылкам, поэтому вам нужно дать переменные. Чтобы предоставить значения по умолчанию, вы должны сделать это, установив сами переменные, например.

if (empty($type)) { 
    $type = "income"; 
} 
+0

Это прекрасно, спасибо. Однако возникает другой вопрос: предположим, что число параметров является динамическим. (например, количество столбцов в таблице не всегда будет одинаковым). Как я могу сделать подготовленные заявления работать в таком случае? – Zero

+0

См. Http://stackoverflow.com/questions/5100046/how-to-bind-mysqli-bind-param-arguments-dynamically-in-php/5108167#5108167 – Barmar

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