我正在尝试准备语句,但下面的代码不起作用。我得到错误:
错误位置:/www/cn/vages/vages.php第12行错误类型:
<?php
$mysqli = new mysqli("localhost", "root", "root", "test");
if ($mysqli->connect_errno) {
echo "Failed to connect to MySQL: " . $mysqli->connect_error;
}
$stmt = $mysqli->prepare("INSERT INTO users (name, age) VALUES (?,?)");
// insert one row
$stmt->execute(array('one',1));
// insert another row with different values
$stmt->execute(array('two',1));
?>
字符串
还有,我需要使用mysqli来做准备语句吗?谁能给我一个完整的例子,从连接到插入到选择,以及错误处理?
3条答案
按热度按时间vngu2lb81#
从
mysqli::prepare
docs:在执行语句或提取行之前,必须使用mysqli_stmt_bind_param()与/或mysqli_stmt_bind_result()将参数标记绑定到应用程序变量.
bind_param
docs的一个。即:
字符串
p8ekf7hl2#
我也需要使用mysqli的准备语句。谁能给我一个完整的例子,从连接到插入到选择,以及错误处理
你也可以使用我更喜欢的PDO。事实上,在你的代码示例中,看起来你把PDO和Mysqli弄混了。
字符串
与mysqli不同,你不必调用一个单独的绑定函数,尽管如果你喜欢/想要/需要使用它,这个功能是可用的。
PDO的另一个有趣之处是命名占位符,它在复杂的查询中可以减少混乱:
型
zrfyljdw3#
连接
mysqli连接的重要性经常被忽视,被简化为一行代码。而正确的连接代码可以解决从安全性到可用性的大量问题。
假设你的代码是通常的过程PHP,这里有一个简单的mysqli连接代码可以包含在你的脚本中:
字符串
完整的解释可以在我的文章How to connect properly using mysqli中找到(以及许多有用的提示),但只是一个小引用来突出最重要的部分:
插入
Insert query是相对简单的,它已经在另一个答案中涵盖了。
您所需要做的就是用问号替换查询中的所有变量(沿着用引号括起来!),然后准备查询,然后将所有变量及其类型放入
bind_param()
中,最后执行查询。只有一个快速提示:MySQL会很乐意接受所有的变量作为字符串,所以不要为某个变量找到正确的类型而发疯,只要使用“s”就可以了。
所以基本上插入是这样的
型
同样的原则也适用于所有其他查询类型,比如UPDATE或UPDATE。
选择
运行select query几乎是一样的,但有一个小技巧。由于一些未知的原因,你不能直接使用熟悉的fetch函数。所以你需要首先获得 mysqli_result,然后才能使用
fetch_assoc()
,fetch_obj()
等:型
**提示:**完全不需要熟悉的
mysqli_num_rows()
函数,如果你想到了,你可以随时使用数据本身,看看你的查询是否返回了任何行:型
多行也是如此,这要归功于
另一个提示:有一个方便的函数
fetch_all()
,它可以一次性获得所有选定行的数组。例如,如果查询返回多行,则可以通过将最后一行更改为型
错误处理
错误处理是最重要的,但有些令人惊讶的部分。尽管有许多文章和例子说,作为一项规则,你不应该写任何错误处理代码。这听起来绝对疯狂,但这正是事情必须做的。大多数时候,你需要做的只是 * 报告 * 错误。mysqli/PHP已经可以为你做这件事,不需要帮助。因此,你不应该编写任何验证查询执行结果的代码--在出现错误的情况下,mysqli会自动报告它,这要归功于#Connection部分提到的
mysqli_report()
函数调用。同样,这个原理的完整解释可以在另一篇文章中找到,致力于一般的PHP error reporting。在极少数情况下,当你真的需要处理错误时,也就是说,在错误的情况下执行一些操作,而不仅仅是报告它,然后将你的查询 Package 在一个
try..catch
中。