准备的select语句作为数组的结果

问题描述 投票:14回答:7

我想将一个预准备语句的完整结果作为数组(键/值对)得到,以便以后在str_replace()函数中使用它。

我的表有三列,索引和字段“x1”和“x2”。我成功使用了以下内容:

$db = new mysqli("servername", "username", "pw", "dbname");

if($ps1 = $db->prepare("SELECT x1, x2 FROM my_table")) {
  $ps1->execute();
  $ps1->bind_result($search, $replace);
    $result = array();
    while ($ps1->fetch()) {
      $result[$search] = $replace;
    }
    $ps1->close();
}

但是,我认为必须有一个更简单的方法,没有while循环,得到完整的结果,而不是从单行逐个添加。

我查看了其他问题,我想出了以下内容,但它不起作用(“警告:mysqli_fetch_assoc()期望参数1为mysqli_result”):

if($ps1 = $db->prepare("SELECT x1, x2 FROM my_table")) {
  $ps1->execute();
  $result = mysqli_fetch_assoc($ps1);
  return $result;
  $ps1->close();
}

我也尝试了$result = mysqli_fetch_all($ps1);没有成功(得到“调用未定义函数mysqli_fetch_all()”)。

顺便说一下,我使用的是PHP 5.6。


关于MYSQLND的评论中的一些答案和讨论之后的补充:

phpinfo()在其mysqlnd部分显示以下信息:

加载的插件:mysqlnd,debug_trace,auth_plugin_mysql_native_password,auth_plugin_mysql_clear_password,auth_plugin_sha256_password

php sql arrays mysqli prepared-statement
7个回答
0
投票

你尝试过这样的事吗?

$db = new mysqli("servername", "username", "pw", "dbname");

if($ps1 = $db->prepare("SELECT x1, x2 FROM my_table")) {
  $ps1->execute();
  $result = $ps1->fetchAll(PDO::FETCH_NAMED);
  $ps1->close();
}

UPDATE

我的意思是这样的(如果你已经安装了mysqlnd驱动程序)

<?php
$link = mysqli_connect("localhost", "my_user", "my_password", "world");

/* check connection */
if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}

$query = "SELECT Name, CountryCode FROM City ORDER by ID DESC LIMIT 150,5";

if ($stmt = mysqli_prepare($link, $query)) {

    /* execute statement */
    mysqli_stmt_execute($stmt);

    /* get result object */
    $result = mysqli_fetch_all(mysqli_stmt_get_result($stmt));

    /* close statement */
    mysqli_stmt_close($stmt);
}

/* close connection */
mysqli_close($link);
?>

2
投票

确实有一种更简单的方法。请考虑使用array_column

$link = mysqli_connect("localhost", "my_user", "my_password", "world");

/* check connection */
if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}

$query = "SELECT x1, x2 FROM my_table";

if ($stmt = mysqli_prepare($link, $query)) {

    /* execute statement */
    mysqli_stmt_execute($stmt);

    /* get result object */
    $rows = mysqli_fetch_all(mysqli_stmt_get_result($stmt), MYSQLI_ASSOC);

    /* get formatted object */
    $result = array_column($rows, 'x2', 'x1');

    /* close statement */
    mysqli_stmt_close($stmt);
}

/* close connection */
mysqli_close($link);

编辑:更新使用程序mysqli函数的答案


1
投票

这就是我使用mysqli在预备语句中使用fetch_all的结果

$stmt = $db->prepare("SELECT x1, x2 FROM my_table")
$stmt->execute();
$result = $stmt->get_result();
$allRows = $result->fetch_all(MYSQLI_ASSOC);

1
投票

请原谅我的英语

我不认为这是可能的,因为mysqli_fetch_assoc()mysqli_result作为参数,而mysqli->prepare->execute返回mysqli_stmt对象。

您可以做的是使用JesusTheHun's答案的程序方式,或者您可以使用$ps1 = $db->query($stmt)而不是prepare and execute然后将其传递给$ps1->fetch_all(MYSQLI_ASSOC)

例:

if($ps1 = $db->query("SELECT x1, x2 FROM my_table")) {
  $result = $ps1->fetch_all(MYSQLI_ASSOC);

  $ps1->close();
  return $result;
}

print_r($result);

mysqli的PHP文档


0
投票

您可以尝试使用如下函数扩展mysqli_result类:

public function my_fetch_keyval() {
    for ($result = array(); $tmp = $this->fetch_row();) {
        // Expecting 2 columns. 1st = Key; 2nd = Value
        $result[$tmp[0]] = $tmp[1];
    }
    return $result;
}

然后你可以在你的代码上使用它:

if($ps1 = $db->prepare("SELECT x1, x2 FROM my_table")) {
    $ps1->execute();
    $my_assoc_array = $ps1->my_fetch_keyval();
    $ps1->close();
}

0
投票

编辑:我查看了您的评论和其他答案,很明显您没有Mysql本机驱动程序。

如果你不想使用mysqlnd,我相信你不能摆脱那个循环;)

============================================================

好像你错过了一件事!

您需要调用get_result()方法,然后调用该对象上的fetch_all()

$db = new mysqli("servername", "username", "pw", "dbname");

if($ps1 = $db->prepare("SELECT x1, x2 FROM my_table")) {
    $ps1->execute();
    $result = $ps1->get_result()->fetch_all();
    //return $result;
    $ps1->close();
}

echo '<pre>';
print_r($result);

另请注意,我已经注释掉了return语句,因为它在此时终止了脚本的执行。

希望能帮助到你 :)


0
投票

从之前的答案(缺少正确的mysqlnd分机 - 有两个,一个用于mysqli,一个用于PDO),我们可以得出结论你有两个选项,你可以使用带有while循环的预处理语句或者标准查询,但将结果作为关联数组返回。

由于您没有任何参数,因此可以安全地使用普通ole查询,因​​为:

a)您没有必须转义的用户输入,您的语句中没有参数,因此没有安全风险

b)准备好的语句的性能提升是疏忽的,因为您将它用作普通的SQL查询。当您一遍又一遍地重复使用相同的语句时,准备好的语句就会闪现,只会更改绑定到它的参数值

所以,让我们切入追逐:

$conn = mysqli($host, $user, $pass, $dbname);

$query = $conn->query("SELECT x1, x2 FROM your_table");

$result = $query->fetch_assoc();

结果将采用以下格式:

[
   'x1' => 'v1',
   'x2' => 'v2'
]

如果您需要整个数据集而不仅仅是一个项目,请使用以下内容:

$result = $query->fetch_all(MYSQLI_ASSOC);

结果将如下所示:

[
    [
      'x1' => 'v1',
      'x2' => 'v2'
   ],
   [
     'x1' => 'v1',
     'x2' => 'v2'
   ],
   ...
]

UPDATE

现在我看到mysqli::fetch_all也为你抛出一个错误,然后我担心没有循环就无法获取整个数据集。如果你想要替代你的方法可能是这样的:

$query = $conn->query("SELECT x1, x2 FROM your_table");

$results = [];
for ($i = 0; $i < $query->num_rows; $i++) {
    $row = $query->fetch_assoc();
    $results[$row['x1']] = $row['x2'];
}

或这个:

while($row = $query->fetch_assoc()) {
   $results[$row['x1']] = $row['x2'];  
}

但说实话,那么你可能会采用你最初的方式,如果你没有mysqli::fetch_all,这是最好的方法

© www.soinside.com 2019 - 2024. All rights reserved.