【问题标题】:Converting mysql functions to mysqli prepared statment keeping the same output将 mysql 函数转换为 mysqli 准备好的语句,保持相同的输出
【发布时间】:2015-11-01 13:21:55
【问题描述】:

我目前正在浏览一个站点并替换所有用于返回 mysql_fectch_array() 结果的函数,这些函数被放入其他地方的 while 循环中。我试图让它们以相同的格式返回相同的数据,但使用 mysqli 准备好的语句输出。我已经成功地使用下面的代码为单行结果生成了相同格式的输出。

public function get_email_settings(){
    $stmt = $this->cn->stmt_init();
    $stmt->prepare("SELECT * FROM email_setting WHERE user_id = ? LIMIT 1");
    $stmt->bind_param("i", $this->user);
    $stmt->execute();
    $stmt->bind_result(
        $row['email_id'],
        $row['user_id'],
        $row['news'],
        $row['new_message'],
        $row['new_friend'],
        $row['rule_assent'],
        $row['agreement_ready'],
        $row['agreement_all_assent'],
        $row['time_cap'],
        $row['donations']
        );
    $stmt->store_result();
    $stmt->fetch();
    $stmt->close();
    return $row;
}

但是当它返回多行时,我怎样才能让这个代码工作呢?我希望它产生与我写的相同的结果:

返回 mysql_fetch_array($result);

有可能吗?

【问题讨论】:

  • 不知道你为什么用bind_result(),试试php.net/manual/en/mysqli-result.fetch-all.php
  • 为什么要在查询中添加LIMIT 1?这可以解释单行结果吗?
  • 谢谢,但我无法确切地弄清楚如何让 fetch_all 正常工作。我使用带有 LIMIT 1 的示例代码作为我如何使单行工作查询工作的工作示例。我只是不能让它对结果产生多于一行的查询起作用。

标签: php mysql mysqli


【解决方案1】:

好的,我已经设法让它在不使用 get_result() 的情况下工作

在 Parfait 和 Example of how to use bind_result vs get_result 的大力帮助下,我做到了这一点

function saved_rules($user){
    $stmt = $this->cn->stmt_init();
    $stmt->prepare("SELECT R.rule_id, R.rule_title
        FROM Savedrules S
        LEFT JOIN Rule R
        ON S.saved_rule_id = R.rule_id
        WHERE S.saved_user_id = ?");
    $stmt->bind_param("i", $user);
    $stmt->execute();
    $stmt->store_result();
    $stmt->bind_result($id, $rule_title);
    while ($stmt->fetch()) {
        $result[] = Array("rule_id"=>$id,"rule_title"=>$rule_title);
    }
    $stmt->free_result();
    $stmt->close();
    return $result;
}

它与使用 mysql_fetch_array() 的输出不完全相同,所以我必须将循环更改为:

foreach($saved_rules AS $row){}

来自

    while ($row = mysql_fetch_array($saved_rules){}

【讨论】:

    【解决方案2】:

    考虑以下调整,将查询结果传递到关联数组中:

    public function get_email_settings(){
        $stmt = $this->cn->stmt_init();
        $stmt->prepare("SELECT  email_id, user_id, news, new_message,
                                new_friend, rule_assent, agreement_ready,
                                agreement_all_assent, time_cap, donations 
                       FROM email_setting 
                       WHERE user_id = ? ");
        $stmt->bind_param("i", $this->user);
        $stmt->execute();
    
        // CREATE RETURN ARRAY
        $row = [];
        // OBTAIN QUERY RESULTS
        $result = $stmt->get_result();
        // ITERATE THROUGH RESULT ROWS INTO RETURN ARRAY
        while ($data = $stmt->fetch_assoc()) {
               $row[] = $data;
        }
    
        $stmt->close();
        return $row;
    

    }

    您会注意到我明确选择查询的字段以避免查询结果的不确定循环。

    【讨论】:

    • 非常感谢您的回答,不幸的是我有一个 plesk 服务器,显然它不支持 mysqlnd 扩展,所以我得到:致命错误:调用未定义的方法 mysqli_stmt::get_result( ) 所以我不能使用 get_result() 是否可以不使用它?
    猜你喜欢
    • 2023-04-09
    • 1970-01-01
    • 2017-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-01
    • 1970-01-01
    相关资源
    最近更新 更多