2014-01-10 45 views
1

我试图将一些旧的php mysql代码转换为PDO格式,但卡住了。我已经看过这里的其他帖子,但无法弄清楚。将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); 

} 

?> 

这是我所能够做到的,但觉得有什么不对的“而”部分。

<?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); 

} 

?> 
+0

'$ sql'是一个字符串,所以当你试图调用'fetchAll'时,它会导致一个错误,指出沿着“试图调用一个非对象的方法”的行。 (我忘记了确切的措词。)如果你有错误报告,你会收到通知。 – bcmcfc

回答

1

PHP.net

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

0

尝试somehing这样的:

<?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:最佳实践是坚持准备好的语句并执行以提高安全性。

+0

如果你要评论安全性,至少要确保你自己的答案;你说得对,准备好的陈述会更好,但如果你不打算给出一个答案来说明如何去做,至少你可以逃脱'$ query'。 – Spudley

+0

我要更新答案,只是等待;) – Hackerman

+0

答案更新,欢呼;) – Hackerman

3

您正试图拨打fetchAll关于“sql”这是一个字符串。现在

,您可以使用查询但我建议你使用准备代替(出于安全原因,因为您将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()) 
0

尝试运行此:也

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

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

,尽量不使用*在你的查询,这不是最好的做法,这是更好地使用,而不是用逗号分隔的列清单,你不需要加载所有列的值。 select *的可扩展性较差,可能是安全漏洞的来源,如意外加载不适当的列并将其值传递给不适当的地方。