bindParam()中的Mysqli Prepared语句不起作用

Fáb*_*nes 7 php mysqli prepared-statement

就像往常一样,我正在寻找使用PHP的最佳实践,准备好的语句似乎是我现在应该如何关闭我的眼睛.所以我开始玩一些我发现的例子.

我在运行脚本时遇到此错误:

致命错误:在第10行的/ opt/lampp/htdocs/phpSecurity/PreparedStatments/Insert-Multi-Binded-Params/Insert Simple Method.php中的非对象上调用成员函数bindParam()

这是代码.

Insert Simple Method.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();
?>
Run Code Online (Sandbox Code Playgroud)

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);
?>
Run Code Online (Sandbox Code Playgroud)

不知道我在这里做错了什么,这是在php.net上找到的类似例子,为什么不工作?PS:我认为mysqli连接不是问题,因为我用它来用SELECT SQL命令做一些准备好的语句.并且工作得很好.


编辑

决议和原因.

示例中,我应该使用bind_param()查询中的每个值.但是感谢Bart,他设法用我的代码来解决问题.

在哪儿:

$stmt->bindParam(1, $nome);
$stmt->bindParam(2, $telefone);
$stmt->bindParam(3, $bi);
Run Code Online (Sandbox Code Playgroud)

它应该是:

$stmt->bind_param("sii", $nome, $telefone, $bi);
Run Code Online (Sandbox Code Playgroud)

现在对于那些可能想知道什么是"sii"的人.

那个bind_param用于我看到它将"$ var"绑定到每个问号"?" 为了.

因此,bind_param()我可以同时将它们全部绑定,并且正常使用bind_param()需要指定被绑定的数据类型.

我要绑定的第一个值是$nome一个字符串,由"s"指定;

而其他$telefone人和$bi整数都是因为他有"我";

对于其他有类似问题的人来说,其他数据类型(来自php.net).

i =整数;

s =字符串;

d =双倍;

b = Blob;

如果有人作为更好的解释,请发布或评论.所以我可以改善自己.

谢谢.

Bar*_*ers 6

您可能认为连接没有问题,但您应该检查以确保:

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

编辑:

当你这样做时会发生什么:

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

桌子coisas拼写正确吗?