如何从准备好的语句中获取关联数组中的所有内容?

时间:2012-06-15 10:06:34

标签: php mysqli

我正在尝试这段代码:

    if ($result = $this->mysqli->prepare("SELECT * FROM `mytable` WHERE `rows1`=?"))
    {

        $result->bind_param("i",$id);
        $result->execute();
        while ($data = $result->fetch_assoc())
        {

            $statistic[] = $data;

        }

        echo "<pre>";
        var_dump($statistic);
        echo "</pre>";
    }

但它引发了以下错误

  

[Fri Jun 15 12:13:11 2012] [error] [client 127.0.0.1] PHP致命错误:   在[myfile.php]中调用未定义的方法mysqli_stmt :: fetch_assoc()

我也尝试过:

if ($result = $this->mysqli->prepare("SELECT * FROM `mytable` WHERE `rows1`=?"))
    {

        $result->bind_param("i",$id);
        $rows = $result->execute();
        while ($data = $rows->fetch_assoc())
        {

            $statistic[] = $data;

        }

        echo "<pre>";
        var_dump($statistic);
        echo "</pre>";
    }

这使得:

  

[2012年6月15日星期五12:22:59] [错误] [客户端127.0.0.1] PHP致命错误:   在非对象中调用成员函数fetch_assoc()   [myfile.php]

我还能做些什么来获得结果或我做错了什么?我需要DB中的assoc数组看起来像$data[0]["id"] = 1

6 个答案:

答案 0 :(得分:23)

事实上你可以很容易地做到这一点,你只是不能用mysqli_stmt对象做,你必须提取底层mysqli_result,你可以做这只需拨打mysqli_stmt::get_result()即可。注意:这需要mysqlnd(MySQL Native Driver)扩展,这可能并不总是可用。

然而,关于在MySQLi上推荐PDO的观点仍然存在,这是一个很好的例子:MySQLi userland API毫无意义。我花了几年时间间歇地使用MySQLi来发现上面概述的机制。现在,我承认将语句和结果集概念分开确实有意义,但在这种情况下,为什么语句有fetch()方法?深思熟虑(如果你仍然坐在MySQLi和PDO之间的栅栏上)。

为了完整起见,这里是一个代码示例(松散地)基于问题中的原始代码:

// Create a statement
$query = "
    SELECT *
    FROM `mytable`
    WHERE `rows1` = ?
";
$stmt = $this->mysqli->prepare($query);

// Bind params and execute
$stmt->bind_param("i", $id);

// Extract result set and loop rows
$result = $stmt->get_result();
while ($data = $result->fetch_assoc())
{
    $statistic[] = $data;
}

// Proof that it's working
echo "<pre>";
var_dump($statistic);
echo "</pre>";

答案 1 :(得分:7)

你可以这样做:

$conn = mysqli_connect('host','username','password','database')
$query = 'select * from tablename';
$result = $conn->query($query);
$data = mysqli_fetch_all($result,MYSQLI_ASSOC);

$data包含assoc数组中的所有结果。

*应该注意,此mysqli_fetch_all()函数仅适用于mysqlnd包。 http://php.net/manual/en/mysqli-result.fetch-all.php

答案 2 :(得分:0)

我不喜欢Mysqli,但是您可以在准备时这样做。

$db = new mysqli('hostAddress', 'username', 'password', 'databaseName');
$db->set_charset('UTF8');

$userID = 2;

$stmt = $db->prepare("SELECT * FROM users WHERE ID = ?");
$stmt->bind_param("i", $userID);
$stmt->execute();

如果您想要结果;

$result = $stmt->get_result();
$user   = $result->fetch_array(1); //one row

或多行

$users  = $result->fetch_all(1);

答案 3 :(得分:-1)

没有尝试过但是用以下内容改变你的while循环条件并再次测试

$data = $result->fetch()

感谢

答案 4 :(得分:-1)

方法execute()返回TRUE或FALSE而不是结果集,因此,不能使用fetch_assoc方法,因为它在布尔值上不存在。你需要的是

mysqli_fetch_assoc($result); //Use in association with query();

如果您愿意,我可以向您发送示例代码。 希望这会有所帮助。

答案 5 :(得分:-1)

这只是一个样本:     

class admin{
  public static function admin($con){
    $users = $con -> query("SELECT * FROM felhasznalok");
    $show = $users-> fetch_all(MYSQLI_ASSOC);
    return $show; 
  }
}

$con = new mysqli("localhost", "root", "", "teszt");
$s = admin::admin($con);
echo "<table > ";
if (is_array($s)) {
    foreach ($s as $key => $value) {
        echo "<tr>";
        foreach ($value as $key2 => $value2) {
            echo "<td><strong>$key2: </strong> $value2</td>";
        }
        echo "</tr>";
    }
    echo "</table>";
}
?>