2013-07-23 58 views
1

我是比较新的PDO和我写了下面的代码块:PDO没有mysql_real_escape_string和bindValue

$id = $_GET['id']; 

$db = new PDO('mysql:host=localhost;dbname=testdb;charset=utf8', 'username', 'password'); 

foreach($db->query("SELECT id,name FROM names where id = '$id' ") as $row) { 
    echo "<p>", ($row['name']), "<br>"; 
} 

我的不确定性:

  1. 是安全的在OMIT mysql_real_escape_string第一行,因为我使用PDO
  2. 是否可以安全地在不使用绑定值的情况下运行上述查询。

感谢

+5

'mysql_real_escape_string'没有连接到PDO;不要使用。它。 Re 2.不,不安全 –

+0

@Pekka,为什么不留下答案? –

+1

@JasonMcCreary因为Pekka有太多的代表......给我们这样的新手留下了一些东西哈哈。 – itachi

回答

5

不,这不是安全的。 PDO不会奇迹般地逃避您的查询。如图所示,您的代码可广泛应用于SQL注入。

如果在查询中使用变量,请不要使用->query。不要试图自己逃脱它们。你应该使用准备好的语句。这是安全的方式。

$stmt = $db->prepare('SELECT id,name FROM names where id = ?'); 
if($stmt->execute(array($id))){ 
    while($row = $stmt->fetch(PDO::FETCH_ASSOC)){ 
     echo "<p>", ($row['name']), "<br>"; 
    } 
} 

所以,是的,你需要使用bindParam,或execute,如图所示。

P.S. mysql_real_escape_string只有为(已弃用)mysql_扩展名。它不适用于PDO。

+0

我会将其标记为答案,但您是否介意澄清两件事:1.是否有办法使代码变得更简单2.在没有涉及变量的情况下也可以使用此方法吗?谢谢。 – adeoba

+0

你想要它更简单吗?它有什么复杂的?如果没有要绑定的变量,那么使用' - > query()'完全可以。 –

+0

好的。我想,:D – adeoba

2

回答你的问题,

  1. 它是安全的忽略mysql_real_escape_string只要您使用绑定(以及....你不能用PDO使用mysql_real_escape_string反正)

  2. 没有。这是绝对不安全的。无论您是否使用PDO都无关紧要。