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

时间:2018-07-13 12:09:15

标签: php sql arrays mysqli prepared-statement

我想获得准备好的语句作为数组(键/值对)的完整结果,以便以后在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

7 个答案:

答案 0 :(得分: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 :(得分: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);

答案 2 :(得分: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文档

答案 3 :(得分: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();
}

更新

我的意思是这样(如果您已经安装了 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);
?>

答案 4 :(得分: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();
}

答案 5 :(得分:0)

编辑:我仔细阅读了您的评论和其他答案,很显然您没有Mysql本机驱动程序。

如果您不想使用mysqlnd,我相信您不能在while循环中摆脱它;)

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

好像您错过了一件事!

您需要调用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语句,因为它在该点终止了脚本的执行。

希望它会有所帮助:)

答案 6 :(得分:0)

从前面的答案(缺少正确的mysqlnd分机-有两个,一个用于mysqli,一个用于PDO),我们可以得出结论,您有两个选项,您可以将准备好的语句与while循环一起使用,也可以将其用作标准查询,但会以关联数组的形式返回结果。

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

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

b)预备语句的性能提升(如果有的话)是微不足道的,因为您将其用作普通的ole 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'
   ],
   ...
]

更新

现在我看到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,这是最好的方法

相关问题