Возникли проблемы при вставке и обновлении таблиц в базе данных с подготовленными операторами

StackOverflow https://stackoverflow.com/questions/652960

  •  19-08-2019
  •  | 
  •  

Вопрос

Очень новичок в 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);
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top