Подготовленный оператор Mysqli в bindParam() не работает

Как обычно, я просматривал лучшие практики работы с PHP, и подготовленные операторы кажутся теми вещами, которые я теперь должен делать с закрытыми глазами. Поэтому я начал играть с некоторыми примерами, которые я нашел.

У меня такая ошибка при запуске скрипта:

Неустранимая ошибка: вызов функции-члена bindParam() для не-объекта в /opt/lampp/htdocs/phpSecurity/PreparedStatments/Insert-Multi-Binded-Params/Insert Simple Method.php в строке 10

Вот и код.

Вставить простой метод.php

<?php
require_once '../config.php';

$stmt = $db->prepare("INSERT INTO coisas (nome, telefone, bi) VALUES (?, ?, ?)");

$nome = 'Fabio Antunes';
$telefone = 916810641;
$bi = 123093456;

$stmt->bindParam(1, $nome);
$stmt->bindParam(2, $telefone);
$stmt->bindParam(3, $bi);

$stmt->execute();

$stmt->close();

$db->close();
?>

config.php

<?php
$server_host = 'localhost';
$server_user = 'root';
$server_password = '';
$server_db = 'PreparedStatements';
$db = new mysqli($server_host, $server_user, $server_password, $server_db);
?>

Не уверен, что я здесь делаю неправильно, это аналогичный пример, найденный на php.net, почему он не работает? PS: я думаю, что соединение mysqli не является проблемой, потому что я использовал его для выполнения некоторых подготовленных операторов с помощью команд SELECT SQL. И работал довольно хорошо.


ИЗМЕНИТЬ

Резолюция и почему.

Что ж, в примере я должен использовать bind_param() для каждого значения в запросе. Но благодаря Барту ему удалось решить проблему с моим кодом.

Где это:

$stmt->bindParam(1, $nome);
$stmt->bindParam(2, $telefone);
$stmt->bindParam(3, $bi);

Должно быть:

$stmt->bind_param("sii", $nome, $telefone, $bi);

Теперь для тех, кому может быть интересно, что такое «sii».

Что ж, bind_param для того, что я вижу, привязывает «$ var» к каждому вопросительному знаку «?» чтобы.

Таким образом, с одним bind_param() я могу связать их все одновременно, а обычное использование bind_param() требует указания типа связываемых данных.

Мое первое значение, которое нужно привязать, это $nome строка, указанная с помощью "s";

А остальные $telefone и $bi являются целыми числами, потому что у него есть "i";

Для других, у которых есть аналогичная проблема, здесь используются другие типы данных (из php.net).

я = целое число;

с = строка;

г = двойной;

б = капля;

Если кто-то в качестве лучшего объяснения, пожалуйста, напишите или прокомментируйте. Так что я могу улучшить свои собственные.

Спасибо.


person Fábio Antunes    schedule 04.11.2009    source источник


Ответы (2)


Вы можете подумать, что с подключением все в порядке, но вам следует проверить, чтобы убедиться:

$db = new mysqli($server_host, $server_user, $server_password, $server_db);
if (mysqli_connect_errno()) {
    printf("DB error: %s", mysqli_connect_error());
    exit();
}

РЕДАКТИРОВАТЬ:

Что происходит, когда вы делаете:

$stmt = $db->prepare("INSERT INTO coisas (nome, telefone, bi) VALUES (?, ?, ?)");
$stmt->bind_param("sii", $nome, $telefone, $bi);
$stmt->execute();

?

Правильно ли написана таблица coisas?

person Bart Kiers    schedule 04.11.2009
comment
Хорошее предложение для лучшей практики. Я пробовал, но это не решило проблему. Любая другая идея? - person Fábio Antunes; 05.11.2009
comment
$stmt-›bind_param(sii, $nome, $telefone, $bi); Работал. - person Fábio Antunes; 05.11.2009
comment
Я не первый раз вижу, как вы отвечаете на один из моих вопросов. Спасибо за особое лечение. - person Fábio Antunes; 05.11.2009

выполните print_r для $stmt после того, как вы вернете его в строку 4. Это реальный объект? Я предполагаю, что нет.

person Zak    schedule 04.11.2009
comment
Не уверен, что это будет делать, но. Проблема заключалась в том, что я использовал параметр привязки для каждого значения, я мог использовать только один, и я не упомянул тип ввода значения (s = строка | i = целое число). Спасибо, в любом случае. - person Fábio Antunes; 05.11.2009
comment
Ошибка указывала на то, что объект ($stmt), метод которого вы вызывали, на самом деле не был объектом. Это могло произойти внутри этого метода, но я сначала предположил, что это был нулевой $stmt. - person Zak; 05.11.2009