我想获得准备好的语句作为数组(键/值对)的完整结果,以便以后在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。
添加:
phpinfo()
在其mysqlnd
部分显示以下信息:
已加载的插件: mysqlnd,debug_trace,auth_plugin_mysql_native_password,auth_plugin_mysql_clear_password,auth_plugin_sha256_password
答案 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
,这是最好的方法