【问题标题】:multi query with prepared statements带有准备好的语句的多查询
【发布时间】:2011-09-11 02:01:54
【问题描述】:

我正在尝试了解multi queries 如何在 mysqli 中工作。但我承认这并不容易理解。

基本上我如何在多查询中进行这些查询?该页面没有讨论多查询中的准备好的语句。

($sql = $db -> prepare("INSERT INTO users (username, email, password) VALUES (?, ?, ?)"));
$sql -> bind_param('sss', $name, $email, $hash);
$sql -> execute();

($sq = $db -> prepare("INSERT INTO activation_link_password_reset  (activation_link) VALUES (?)"));
$sq -> bind_param('s', $linkHash);
$sq -> execute();

【问题讨论】:

    标签: php mysql mysqli prepared-statement mysqli-multi-query


    【解决方案1】:

    实际上,我几天前才发现这一点。迁移到 MySQLi 并非易事,但我会继续向您展示准备好的语句的查询循环。

    $db = new mysqli(...)
    
    $statement = $db->prepare('SELECT count(*) as [hitchhikers] FROM `T_Users` WHERE `id` > ? AND `signin` like ?');
    $statement->bind_param("ss", 42, '%adams');
    
    if ($statement->execute())
    {
        $statement->store_result();
        $statement->bind_result($hitchhikers);
        $statement->fetch();
    
        // do something with hitchhikers here
    }
    else
    {
        // there was a problem with the execution, check $db->error
    }
    
    $statement->close();
    $db->next_result();
    

    这里的所有内容都类似于非 oo 格式,通过将 -> 替换为 _ 并将返回的值传递给新函数,但是这里的这个过程几乎就是你应该对这些语句中的每一个执行的操作。您也可以使用 mysqli 包装类将其抽象出来。

    $db->next_result() 通话后,您可以再次重复该过程。此更改与 MySQLi 处理 MySQL 连接和结果的方式有关。当然,您可以通过切换回 mysql_ 查询和资源来完全避免这个问题。

    特别是对于 multi_query,您在单个字符串中用分号分隔查询。您链接到的示例显示了如何处理结果。

    MySQLi Book @PHP.net

    【讨论】:

    • 你只是使用了一个查询,而不是我假装的两个。
    • 您想要一个具体的例子吗?一个看起来不像链接的那个?
    • 我对单个查询没有任何问题。该问题与带有准备好的语句的多查询有关。谢谢。
    • 我明白了。您不能使用 multi_query 和准备好的语句。没有为它们进行绑定的机制。
    【解决方案2】:

    你不能在那里使用准备好的语句,而且加速也可以忽略不计,所以去更容易调试单独的查询。

    如果您真的想用准备好的语句在 1 次调用中完成,请创建一个 PROCEDURE(更难调试...),并准备 CALL(:param1,:param2);

    【讨论】:

    • 速度是最低的。我的当务之急是 SQL 注入。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-20
    • 1970-01-01
    相关资源
    最近更新 更多