2011-06-16 166 views
1

我只是想知道是否有一种方法可以在MySQL中使用某种形式的预准备语句,所以我不必逃避所有输入,也不必从MySQL切换所有文件到MySQLi。我真的不相信转义函数,因此,如果有任何替代方法在常规MySQL中工作,那就太棒了。MySQL准备好的语句

回答

7

使用PDO (PHP Data Objects)连接到您的MySQL数据库。此方法将确保所有数据库输入始终被视为文本字符串,并且您将永远不必执行任何手动转义。

这结合正确使用html_entities()来显示数据您的数据库是一个可靠的方法来保护您的网页免受注入。我总是使用PDO来处理我的项目中的所有数据库连接。

创建数据库对象(在这种情况下执行特定的字符编码):

try { 
    $db = new PDO("mysql:host=[hostname];dbname=[database]",'[username]','[password]'); 
    $db->setAttribute(PDO::MYSQL_ATTR_INIT_COMMAND, "SET NAMES utf8"); 
    $db->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); 
    $db->exec('SET NAMES utf8'); 
} catch (PDOException $e) { 
    echo $e->getMessage(); 
} 

然后使用它像这样:

$id = 1; 
$q = $db->prepare('SELECT * FROM Table WHERE id = ?'); 
$q->execute(array($id)); 
$row = $q->fetch(); 
echo $row['Column_1']; 

$q = $db->prepare('UPDATE Table SET Column_1 = ?, Column_2 = ? WHERE id = ?'); 
$q->execute(array('Value for Column_1','Value for Column_2',$id)); 

,并用通配符:

$search = 'John'; 
$q = $db->prepare('SELECT * FROM Table WHERE Column_1 LIKE ?'); 
$q->execute(array('%'.$search.'%')); 
$num = $q->rowCount(); 
if ($num > 0) { 
    while ($row = $q->fetch()) { 
    echo $row['Column_1']; 
    } 
} else { 
    echo "No hits!"; 
} 

了解更多:

How can I prevent SQL injection in PHP?

When *not* to use prepared statements?

how safe are PDO prepared statements

http://php.net/manual/en/book.pdo.php

0

如果您不想处理转义输入,那么您可以随时调整它的匹配方式,然后发送预写的语句。如果你可能执行的语句相对较少,这实在是值得的。