如何在PHP中使用PDO获取结果数组?

如何在PHP中使用PDO获取结果数组?,php,mysql,pdo,Php,Mysql,Pdo,在阅读了SQL注入攻击之后,我正在编辑我的搜索脚本。我正在尝试使用PDO而不是常规的mysql连接从脚本中获得相同的功能。所以我一直在读其他关于PDO的帖子,但我不确定。这两个脚本是否提供相同的功能 对于PDO: $pdo = new PDO('mysql:host=$host; dbname=$database;', $user, $pass); $stmt = $pdo->prepare('SELECT * FROM auction WHERE name = :name'); $stm

在阅读了SQL注入攻击之后,我正在编辑我的搜索脚本。我正在尝试使用PDO而不是常规的mysql连接从脚本中获得相同的功能。所以我一直在读其他关于PDO的帖子,但我不确定。这两个脚本是否提供相同的功能

对于PDO:

$pdo = new PDO('mysql:host=$host; dbname=$database;', $user, $pass);
$stmt = $pdo->prepare('SELECT * FROM auction WHERE name = :name');
$stmt->bindParam(':name', $_GET['searchdivebay']);
$stmt->execute(array(':name' => $name);
对于常规mysql:

$dbhost = @mysql_connect($host, $user, $pass) or die('Unable to connect to server');

@mysql_select_db('divebay') or die('Unable to select database');
$search = $_GET['searchdivebay'];
$query = trim($search);

$sql = "SELECT * FROM auction WHERE name LIKE '%" . $query . "%'";



if(!isset($query)){
echo 'Your search was invalid';
exit;
} //line 18

$result = mysql_query($trim);
$numrows = mysql_num_rows($result);
mysql_close($dbhost);
我继续使用常规示例

while($i < $numrows){
$row = mysql_fetch_array($result);
while($i<$numrows){
$row=mysql\u fetch\u数组($result);
从数据库中创建匹配结果数组。如何使用PDO执行此操作?

查看此方法。您也可以在迭代器模式中使用

PHP文档中的fetchAll代码示例:

<?php
$sth = $dbh->prepare("SELECT name, colour FROM fruit");
$sth->execute();

/* Fetch all of the remaining rows in the result set */
print("Fetch all of the remaining rows in the result set:\n");
$result = $sth->fetchAll(\PDO::FETCH_ASSOC);
print_r($result);

有三种方法可以获取PDO语句返回的多行

最简单的方法就是迭代PDO语句本身:

$stmt = $pdo->prepare("SELECT * FROM auction WHERE name LIKE ?")
$stmt->execute(array("%$query%"));
// iterating over a statement
foreach($stmt as $row) {
    echo $row['name'];
}
另一种方法是在熟悉的while语句中使用fetch()方法获取行:

$stmt = $pdo->prepare("SELECT * FROM auction WHERE name LIKE ?")
$stmt->execute(array("%$query%"));
// using while
while($row = $stmt->fetch()) {
    echo $row['name'];
}
但对于现代web应用程序,我们应该将datbase Iterations与输出分离,因此最方便的方法是使用fetchAll()方法一次获取所有行:

或者,如果需要先预处理某些数据,请使用while循环并手动将数据收集到数组中

$result = [];
$stmt = $pdo->prepare("SELECT * FROM auction WHERE name LIKE ?")
$stmt->execute(array("%$query%"));
// using while
while($row = $stmt->fetch()) {
    $result[] = [
        'newname' => $row['oldname'],
        // etc
    ];
}
然后将其输出到模板中:

<ul>
<?php foreach($data as $row): ?>
    <li><?=$row['name']?></li>
<?php endforeach ?>
</ul>

请注意,PDO支持。

mysql*版本到底是如何工作的?在声明它之前,您正在使用
$query
。“常规”代码不起作用。你设置了
$query
之后设置了
$sql
。可能是重复的啊,是的,我测试过了,我只是把它弄糟了,复制到这里使用,但在我的真实脚本上,一切都是按顺序的。我编辑了你问题的标题,因为它与真正的问题没有什么关系,因此会产生误导。通常情况下我会对类似这样的重复问题投反对票,但我不会这么做,因为很少有人真正接受我们的建议并使用参数化查询!
\PDO::FETCH_ASSOC
\PDO::FETCH_NUM
允许您定义抓取模式。
\PDO::FETCH_ASSOC
将只返回
字段=>值
array,而
\PDO::FETCH_NUM
只返回带有数字键的数组,而
\PDO::FETCH_两者都将返回与答案相同的结果。在这种情况下,此常量应传递给
->fetchAll()
方法。如果我现在只想输出它们的数组呢?我只想说让我们输出数组[0]价值观​​当然可以,怎么做?
$result = [];
$stmt = $pdo->prepare("SELECT * FROM auction WHERE name LIKE ?")
$stmt->execute(array("%$query%"));
// using while
while($row = $stmt->fetch()) {
    $result[] = [
        'newname' => $row['oldname'],
        // etc
    ];
}
<ul>
<?php foreach($data as $row): ?>
    <li><?=$row['name']?></li>
<?php endforeach ?>
</ul>