mysql — используя подготовленные операторы MySQLi в PHP, получая & quot; не предоставлены данные для параметров в подготовленном выражении & quot;

Я пытаюсь обновить свой сайт, чтобы использовать подготовленные заявления, но я продолжаю получать эту ошибку, и я не могу понять, почему. Я искал в Google и Stackoverflow в течение недели, пробуя все, что нашел, но ничего не решило проблему. Я уверен, что я просто что-то неправильно понимаю. Вот код, который выдает ошибку:

$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

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

Эрик

1

Решение

Ты не звонишь bind_param несколько раз для каждого параметра, вы вызываете его один раз со всеми параметрами.

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

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

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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]