Возникли проблемы при вставке и обновлении таблиц в базе данных с подготовленными операторами
Вопрос
Очень новичок в PHP5 и у меня все еще есть проблемы. Я выяснил, как выбрать с подготовленными утверждениями, теперь пытающимися вставить / обновить мой код, следующим образом
function input_lab_results($name, $image, $descrip) {
$query = "INSERT INTO pat_table (pat_name, pat_image, pat_descrip, pat_doctor, pat_resident, pat_create, pat_modify) VALUES (?, ?, ?, ?, ?, ?, ?)";
if($stmt = $this->conn->prepare($query)){
$stmt->bind_param('sssiidd', $name, $image, $descrip, 0, 0, date("Ymd"), date("Ymd"));
$stmt->execute();
die();
} else{
die($this->conn->error);
}
}
Я получаю ошибку
Неустранимая ошибка: невозможно передать параметр 4 по ссылке html / classes / mySQL.php в строке 43
Любая помощь / ссылки будут оценены. Спасибо.
<Ч>Все упоминают об использовании PDO. У вас есть хорошие уроки или примеры этого, пожалуйста?
Решение 2
Я изменил его на
function input_lab_results($name, $image, $descrip) {
$query = "INSERT INTO pat_table (pat_name, pat_image, pat_descrip, pat_doctor, pat_resident, pat_create, pat_modify) VALUES (?, ?, ?, 0, 0, ?, ?)";
if($stmt = $this->conn->prepare($query)){
$stmt->bind_param('sssdd', $name, $image, $descrip, date("Ymd"), date("Ymd"));
$stmt->execute();
die();
} else{
die($this->conn->error);
}
}
В основном я изменился, где он читал ?? для целого числа 0 в запросе я не связывал его.
Другие советы
проблема не в $descrip
; это 0s (параметры 4 & и 5). решение состоит в том, чтобы передавать переменные, а не целые числа:
`$query = "INSERT INTO pat_table (pat_name, pat_image, pat_descrip, pat_doctor, pat_resident, pat_create, pat_modify) VALUES (?, ?, ?, ?, ?, ?, ?)";`
$pat_doctor = 0;
$pat_resident = 0;
if($stmt = $this->conn->prepare($query)){
$stmt->bind_param('sssiidd', $name, $image, $descrip, $pat_doctor, $pat_resident, date("Ymd"), date("Ymd"));`
Очевидно, mysqli_bind_param хочет, чтобы его аргументы были ссылками, поэтому он ищет, где они хранятся в памяти, а не копирует их значения. это имеет смысл, так как некоторые вещи, которые вы хотели бы связать с оператором sql, например, этот образ, вероятно, достаточно велики, чтобы избежать лишних копий. литералы, строковые или иные, не доступны по ссылке. см .: http://us.php.net/references
Я не предлагаю жестко кодировать 0 в выражении sql, так как это излишне запутывает ваш код.
позвольте мне предложить PDO, кстати. его синтаксис гораздо разумнее.
Не используйте bind_param
- это очень неинтуитивный и подверженный ошибкам интерфейс, который по большей части является наследием лежащего в основе C-api. Используйте bind_value
или еще лучше - передайте массив значений как аргумент для PDOStatement->execute
. Например:.
$query = "INSERT INTO pat_table (pat_name, pat_image, pat_descrip, pat_doctor, pat_resident, pat_create, pat_modify) VALUES (?, ?, ?, 0, 0, ?, ?)";
if ($stmt = $this->conn->prepare($query)) {
$stmt->execute(array($name, $image, $descrip, date("Ymd"), date("Ymd")));
die();
} else {
die($this->conn->error);
}