Я пытаюсь использовать подготовленные операторы в первый раз и сталкиваюсь с следующей проблемой с кодом ниже
Ошибка :
Предупреждение: mysqli_stmt_bind_param () ожидает, что параметр 1 будет
mysqli_stmt, логическое значение
Код:
$stmt = mysqli_prepare($db, "INSERT INTO fragrances(name, description, essentialoils, topnotes, middlenotes, basenotes, reference, year, type, price, fragrancehouse, triangle, extractname, extractreference, extractprice, extractfragrancehouse, disccolour, collarcolour, actuatorcolour)
VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
mysqli_stmt_bind_param($stmt, 'sssssssssssssssssss', $name, $description, $essentialoils, $topnotes, $middlenotes, $basenotes, $reference, $year, $type, $price, $fragrancehouse, $triangle, $extractname, $extractreference, $extractprice, $extractfragrancehouse, $disccolour, $collarcolour, $actuatorcolour);
mysqli_stmt_execute($stmt);
Я рассмотрел много разных вопросов здесь, и ни одно из их решений, кажется, не подходит для моей проблемы, кто-нибудь знает, в чем проблема?
обратите внимание, все мои переменные являются строками
Спасибо
$stmt
становится логическим только тогда, когда mysqli_prepare
возвращает ложь
Когда это происходит, это означает, что он не подготовил запрос, поэтому вам нужно проверить ошибки:
$stmt = mysqli_stmt_init($db);
if (mysqli_stmt_prepare($stmt, 'INSERT INTO fragrances VALUES...')) {
//it's all good bind and execute here
}else{
//we have a problem
printf("Errormessage: %s\n", mysqli_error($db));
}
Сообщение об ошибке означает, что ваш mysqli_prepare
вернул логическое значение (а для вашего случая вернул false
).
Вам нужно заменить все ваше имя поля на символ ?
сделать ваше готовое заявление. Вот как это работает.
Смотрите пример в официальной документации
РЕДАКТИРОВАТЬ Смотрите также mysqli_error , который подробно опишет вашу ошибку. На самом деле, вы всегда должны проверять переменную перед ее использованием:
$stmt = mysqli_prepare($db, "....");
if(!$stmt)
echo mysqli_error($db); // display error only for debug. Avoid this in production
Это означает, что ваш SQL был неверным, потому что prepare
возвращает ложь;
Ваш SQL должен быть;
$stmt = mysqli_prepare($db, "INSERT INTO fragrances VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )");
каждый ?
чтобы показать, где каждый параметр должен быть связан соответственно.
Ваш INSERT
заявление недействительно: VALUES
пункт должен быть с ?
в скобках (и после имен полей в скобках). Также хорошей практикой является проверка $stmt
после назначения:
$stmt = mysqli_prepare($db,
"INSERT INTO fragrances (name, description, essentialoils, topnotes, middlenotes, basenotes, reference, year, type, price, fragrancehouse, triangle, extractname, extractreference, extractprice, extractfragrancehouse, disccolour, collarcolour, actuatorcolour)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
if ($stmt) {
mysqli_stmt_bind_param($stmt, 'sssssssssssssssssss', $name, $description, $essentialoils, $topnotes, $middlenotes, $basenotes, $reference, $year, $type, $price, $fragrancehouse, $triangle, $extractname, $extractreference, $extractprice, $extractfragrancehouse, $disccolour, $collarcolour, $actuatorcolour);
mysqli_stmt_execute($stmt);
// ...
} else
printf("Error: %s\n", mysqli_error($db));