将mysql转换为PDO格式

时间:2014-01-10 14:01:18

标签: php mysql pdo

我正在尝试将一些旧的php mysql代码转换为PDO格式但是卡住了。我已经看过这里的其他帖子,但无法弄明白。

这是旧代码:

<?php

if (isset($_POST['query'])) {
    // Connect to database
    mysql_connect("localhost", "xxxxx", "xxxxx");
    mysql_select_db("xxxxx");

    // Retrieve the query
    $query = $_POST['query'];

    // Search the database for all similar items
    $sql = mysql_query("SELECT * FROM articles WHERE title LIKE '%{$query}%'");
    $array = array();

    while ($row = mysql_fetch_assoc($sql)) 
    {
     $array[] = $row['title'];
    }

    // Return the json array
    echo json_encode($array);

}

?>

这就是我设法做的事情,但认为“while”部分出了问题。

<?php

if (isset($_POST['query'])) {
require( "config.php" );
$conn = new PDO( DB_DSN, DB_USERNAME, DB_PASSWORD );

// Retrieve the query
$query = $_POST['query'];

// Search the database for all similar items
$sql = "SELECT * FROM articles WHERE title LIKE '%{$query}%'";
$array = array();

while ($row = $sql->fetchAll()) {
    $array[] = $row['title'];
}

// Return the json array
echo json_encode($array);

}

?>

4 个答案:

答案 0 :(得分:3)

您正尝试在“sql”上调用 fetchAll ,这是一个字符串。

现在,您可以使用查询,但我建议您使用准备(出于安全原因,因为您插入了POST数据)。

$q = $conn->prepare("SELECT * FROM articles WHERE title LIKE CONCAT('%', ? ,'%')");
$q->execute(array($query));

// result contains all returned data
$result = $q->fetchAll();

// or row by row
while($row = $q->fetch())

答案 1 :(得分:1)

来自PHP.net

foreach ($conn->query($sql) as $row) {

答案 2 :(得分:0)

尝试这样的事情:

<?php

 if (isset($_POST['query'])) {
 require( "config.php" );
 $conn = new PDO( DB_DSN, DB_USERNAME, DB_PASSWORD );

 // Retrieve the query
 $query = $_POST['query'];

 //Build Query - Search the database for all similar items
 $sql = "SELECT * FROM articles WHERE title LIKE '%{$query}%'";
 $array = array();
 $sth = $conn->query($sql);
 $result = $sth->fetchAll();

 foreach($result as $row){
 $array[] = $row['title'];
 }

 // Return the json array
 echo json_encode($array);

}

?>

=========更新的答案========

//Better alternative
 $query = $_POST['query'];
 $sql = "SELECT * FROM articles WHERE title LIKE CONCAT('%', ? ,'%')";
 $sth = $con->prepare($sql);
 $sth->bind_param("s", $query);
 $sth->execute();
 $result = $sth->fetchAll();

 foreach($result as $row){
 $array[] = $row['title'];
 } 
 // Return the json array
 echo json_encode($array);

PS:最佳做法是坚持准备好的陈述并执行以提高安全性。

答案 3 :(得分:0)

尝试运行:

$rows = $conn->prepare("SELECT * FROM articles WHERE title LIKE ?")->execute(array('%'.$query.'%'))->fetchAll();

while($row = $rows->fetch()) {
    // TODO: Parse the rows
}

另外,尽量不要在查询中使用*,这不是最佳做法,最好使用以逗号分隔的列列表,因为您不需要加载所有列的值。 select *的可伸缩性较低,可能是安全漏洞的来源,例如意外加载不合适的列并将其值传递到不适当的位置。