php 如何使用mysqli准备好的语句?

yptwkmov  于 12个月前  发布在  PHP
关注(0)|答案(3)|浏览(155)

我正在尝试准备语句,但下面的代码不起作用。我得到错误:
错误位置:/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来做准备语句吗?谁能给我一个完整的例子,从连接到插入到选择,以及错误处理?

vngu2lb8

vngu2lb81#

mysqli::prepare docs
在执行语句或提取行之前,必须使用mysqli_stmt_bind_param()与/或mysqli_stmt_bind_result()将参数标记绑定到应用程序变量.
bind_param docs的一个。
即:

$name = 'one';
$age  = 1;

$stmt = $mysqli->prepare("INSERT INTO users (name, age) VALUES (?,?)");

// bind parameters. I'm guessing 'string' & 'integer', but read documentation.
$stmt->bind_param('si', $name, $age);

// *now* we can execute
$stmt->execute();

字符串

p8ekf7hl

p8ekf7hl2#

我也需要使用mysqli的准备语句。谁能给我一个完整的例子,从连接到插入到选择,以及错误处理
你也可以使用我更喜欢的PDO。事实上,在你的代码示例中,看起来你把PDO和Mysqli弄混了。

$db = new PDO($dsn, $user, $pass);
$stmt = $db->prepare("INSERT INTO users (name, age) VALUES (?,?)");
$stmt->execute(array($name1, $age1));
$stmt->execute(array($name2, $age2));

字符串
与mysqli不同,你不必调用一个单独的绑定函数,尽管如果你喜欢/想要/需要使用它,这个功能是可用的。
PDO的另一个有趣之处是命名占位符,它在复杂的查询中可以减少混乱:

$db = new PDO($dsn, $user, $pass);
$stmt = $db->prepare("INSERT INTO users (name, age) VALUES (:name,:age)");
$stmt->execute(array(':name' => $name1, ':age' => $age1));
$stmt->execute(array(':name' => $name2, ':age' => $age2));

zrfyljdw

zrfyljdw3#

连接

mysqli连接的重要性经常被忽视,被简化为一行代码。而正确的连接代码可以解决从安全性到可用性的大量问题。
假设你的代码是通常的过程PHP,这里有一个简单的mysqli连接代码可以包含在你的脚本中:

$host = '127.0.0.1';
$db   = 'test';
$user = 'root';
$pass = '';
$charset = 'utf8mb4';

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli($host, $user, $pass, $db);
$mysqli->set_charset($charset);
unset($host, $db, $user, $pass, $charset); // we don't need them anymore

字符串
完整的解释可以在我的文章How to connect properly using mysqli中找到(以及许多有用的提示),但只是一个小引用来突出最重要的部分:

  • 为连接设置适当的字符集将消除整个错误类别,例如奇怪的字符/问号而不是您的数据,空的json_encode()输出,存储表情符号的问题等。
  • 设置正确的错误报告模式将消除像mysqli_fetch_asphalt()expects parameter.../ Call to a member function bind_param()...这样的神秘错误消息,而是给你来自MySQL的实际错误消息。

插入

Insert query是相对简单的,它已经在另一个答案中涵盖了。
您所需要做的就是用问号替换查询中的所有变量(沿着用引号括起来!),然后准备查询,然后将所有变量及其类型放入bind_param()中,最后执行查询。
只有一个快速提示:MySQL会很乐意接受所有的变量作为字符串,所以不要为某个变量找到正确的类型而发疯,只要使用“s”就可以了。
所以基本上插入是这样的

$sql = "INSERT INTO users (name, email, password) VALUES (?,?,?)";
$stmt= $conn->prepare($sql);
$stmt->bind_param("sss", $name, $email, $password_hash);
$stmt->execute();


同样的原则也适用于所有其他查询类型,比如UPDATE或UPDATE。

选择

运行select query几乎是一样的,但有一个小技巧。由于一些未知的原因,你不能直接使用熟悉的fetch函数。所以你需要首先获得 mysqli_result,然后才能使用fetch_assoc()fetch_obj()等:

$sql = "SELECT * FROM users WHERE id=?"; // SQL with parameters
$stmt = $conn->prepare($sql);
$stmt->bind_param("s", $id);
$stmt->execute();
$result = $stmt->get_result(); // get the mysqli result
$user = $result->fetch_assoc(); // fetch data

**提示:**完全不需要熟悉的mysqli_num_rows()函数,如果你想到了,你可以随时使用数据本身,看看你的查询是否返回了任何行:

$user = $result->fetch_assoc();
if ($user) {
    // found!
}


多行也是如此,这要归功于

另一个提示:有一个方便的函数fetch_all(),它可以一次性获得所有选定行的数组。例如,如果查询返回多行,则可以通过将最后一行更改为

$users = $result->fetch_all(MYSQLI_ASSOC); // fetch data

错误处理

错误处理是最重要的,但有些令人惊讶的部分。尽管有许多文章和例子说,作为一项规则,你不应该写任何错误处理代码。这听起来绝对疯狂,但这正是事情必须做的。大多数时候,你需要做的只是 * 报告 * 错误。mysqli/PHP已经可以为你做这件事,不需要帮助。因此,你不应该编写任何验证查询执行结果的代码--在出现错误的情况下,mysqli会自动报告它,这要归功于#Connection部分提到的mysqli_report()函数调用。同样,这个原理的完整解释可以在另一篇文章中找到,致力于一般的PHP error reporting
在极少数情况下,当你真的需要处理错误时,也就是说,在错误的情况下执行一些操作,而不仅仅是报告它,然后将你的查询 Package 在一个try..catch中。

相关问题