Возникли проблемы при вставке и обновлении таблиц в базе данных с подготовленными операторами - PullRequest
0 голосов
/ 17 марта 2009

Очень плохо знаком с 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, у вас, ребята, есть какие-нибудь хорошие учебники или примеры этого, пожалуйста?

Ответы [ 3 ]

1 голос
/ 17 марта 2009

это не $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. его синтаксис гораздо разумнее.

1 голос
/ 17 марта 2009

Я изменил его на

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 в запросе я не связывал его.

0 голосов
/ 17 марта 2009

Не используйте bind_param - Это очень неинтуитивный и подверженный ошибкам интерфейс, который по большей части является наследием лежащего в основе C-api. Используйте bind_value или еще лучше - передайте массив значений в качестве аргумента PDOStatement->execute. Eg.:

$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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...