Mysqli Prepare不是在另一个准备好的声明中工作

时间:2013-11-03 07:29:46

标签: php mysql sql mysqli

我试图在准备好的声明中运行一个准备好的声明,但没有成功。这是我的代码:

if ($stmt = $mysqli->prepare("SELECT author_id FROM posts")) {
$stmt->execute();
$stmt->bind_result($author_id);
    while ($stmt->fetch()) {
        if ($stmt2 = $mysqli->prepare("SELECT username FROM users WHERE id=? LIMIT 1")) {
            $stmt2->bind_param("s", $author_id);
            $stmt2->execute();
            $stmt2->bind_result($username);
            $stmt2->fetch();
            $stmt2->close();

            //showing username
            echo $username;
        }
    }
    $stmt->close();
}

我从表中获取author id,然后从author id获取我正在尝试从另一个表中获取作者姓名。
你能告诉我任何方式这样做,或者这个脚本中的任何修改都可以完成它。

2 个答案:

答案 0 :(得分:2)

有时这个网站的PHP部分让我的眼睛疼痛。不仅问题在编程的各个方面缺乏非常基础的知识,而且答案也会促进可怕的实践。

  1. 您必须报告错误才能让自己了解某些原因。通常的方式,通过$conn->error或通过在异常模式下设置mysqli。
  2. 阅读完错误消息后,您可以谷歌寻求解决方案 - store_result()
  3. 对于这样的数据集,无需循环,因为您必须使用 JOIN
  4. 所以整个代码变成了

    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
    
    $sql = "SELECT username FROM posts p, users u WHERE u.id=author_id";
    $res = $mysqli->query($sql);
    while ($row = mysqli_fetch_row()) {
        echo $row[0];
    }
    

答案 1 :(得分:-2)

使用另一个mysqli对象进行内循环。

$mysqli = new mysqli(host, user, password, dbname);
$mysqli2 = new mysqli(host, user, password, dbname);

if ($stmt = $mysqli->prepare("SELECT author_id FROM posts")) {
$stmt->execute();
$stmt->bind_result($author_id);
while ($stmt->fetch()) {
    if ($stmt2 = $mysqli2->prepare("SELECT username FROM users WHERE id=? LIMIT 1")) {
        $stmt2->bind_param("s", $author_id);
        $stmt2->execute();
        $stmt2->bind_result($username);
        $stmt2->fetch();
        $stmt2->close();

        //showing username
        echo $username;
    }
}
$stmt->close();