我想将一个预准备语句的完整结果作为数组(键/值对)得到,以便以后在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
你尝试过这样的事吗?
$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);
?>
确实有一种更简单的方法。请考虑使用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函数的答案
这就是我使用mysqli在预备语句中使用fetch_all
的结果
$stmt = $db->prepare("SELECT x1, x2 FROM my_table")
$stmt->execute();
$result = $stmt->get_result();
$allRows = $result->fetch_all(MYSQLI_ASSOC);
请原谅我的英语
我不认为这是可能的,因为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文档
您可以尝试使用如下函数扩展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();
}
编辑:我查看了您的评论和其他答案,很明显您没有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
语句,因为它在此时终止了脚本的执行。
希望能帮助到你 :)
从之前的答案(缺少正确的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
,这是最好的方法