在mysqli中存储并迭代查询结果


Store and iterate over result of query in mysqli

这是我在php中使用mysqli面向对象风格的简单查询:

$query = "SELECT name FROM usertable WHERE id = ?";
$stmt = $mysqli->prepare($query);
$stmt->bind_param('i', $id);
$id= $_GET['id'];
$stmt->execute();
$stmt->bind_result($name);
while($stmt->fetch()){
   echo $name." ";
}
$stmt->free_result();
$stmt->close();

这很好用。我获得了从select语句中检索到的名称列表。

现在,在while中,我想使用$name变量作为另一个查询的参数,但mysqli不允许这样做,因为我必须关闭第一个查询,然后调用第二个查询。

因此,我认为我必须存储第一个查询的结果,然后迭代调用新查询的结果。

我尝试过以下几种:

$query = "SELECT name FROM usertable WHERE id = ?";
$stmt = $mysqli->prepare($query);
$stmt->bind_param('i', $id);
$id= $_GET['id'];
$stmt->execute();
//$stmt->bind_result($name);
$result = $stmt->store_result();
$stmt->free_result();
$stmt->close();
while ($row = $result->fetch_row()) 
{
    echo $row[0]." ";
}

但这并不奏效。while内部的代码永远无法访问。

注意:我想避免使用multi_query()

mysqli_stmt::store_result返回布尔值。根据医生的说法,它应该是这样的:

$stmt->execute();
$stmt->store_result();
$stmt->bind_result($name);
while($stmt->fetch()){
    //echo $name." ";
    // try another statement
    $query = "INSERT INTO usertable ...";
    $stmt2 = $mysqli->prepare($query);
    ...
}
$stmt->free_result();
$stmt->close();

如果这不起作用,您可以先将所有行提取到一个数组中,然后再次循环该数组:

$stmt->execute();
$stmt->bind_result($name);
$names = array();
while($stmt->fetch()){
    $names[] = $name;
}
$stmt->free_result();
$stmt->close();
foreach($names as $name) {
    $query = "INSERT INTO usertable ...";
    $stmt = $mysqli->prepare($query);
    ...
}

我已经解决了问题:

$query = "SELECT name FROM usertable WHERE id = ?";
$stmt = $mysqli->prepare($query);
$stmt->bind_param('i', $id);
$id= $_GET['id'];
$stmt->execute();
$result = $stmt->get_result();
$stmt->free_result();
$stmt->close();
while ($row = $result->fetch_array(MYSQLI_NUM)) 
{
    echo $row[0]." ";
}

简单使用get_result()fetch_array()