PHP中的参数化查询

时间:2015-07-29 11:19:16

标签: php mysql

$postid = $_GET['p'];

$stmt = $conn->prepare("SELECT * FROM posts WHERE post_id=:postid");
$stmt->bindValue(':postid', $postid);
$stmt->execute();

while($postRows = mysqli_fetch_assoc($stmt)){
    $posts[] = $postRows;
}

上述代码不起作用。

通常我会这样做:

$postid = mysqli_real_escape_string($conn,$_GET['p']);
$result = mysqli_query($conn,"SELECT * FROM posts WHERE post_id='$postid'");

while($postRows = mysqli_fetch_assoc($result)){
    $posts[] = $postRows;
} 

对我有用。

我似乎无法理解这一点,因为在线解释在实际解释如何执行这些操作方面做得不好,所以我一直在使用mysqli_real_escape_string,但我知道它可能很容易受到攻击。  任何人都可以帮我理解如何正确地进行这些查询吗?

4 个答案:

答案 0 :(得分:1)

正如我在评论中所说,你正在混合MySQL API(mysqli_和PDO)。

您需要使用相同的API连接到查询。那些不同的API不会混合。

要使用PDO,您需要:

然后,如果您想将PDO用于预先准备的语句:

您无法与mysqli_连接,然后将MySQL功能与PDO混合。

它是如何滚动的。

脚注:

如果你想坚持mysqli_,那么它也有准备好的陈述。

选择是你的。请记住使用相同的MySQL API。

错误检查:

http://php.net/manual/en/mysqli.error.php添加到文件的顶部,这有助于查找错误。

<?php 
error_reporting(E_ALL);
ini_set('display_errors', 1);

// rest of your code

旁注:只应在暂存时进行显示错误,而不是生产。

答案 1 :(得分:0)

您可以尝试此代码

  $stmt = $conn->prepare("SELECT * FROM posts WHERE post_id=:postid");
  $stmt->bindValue(':postid', $postid, PDO::PARAM_INT);
  $stmt->execute();
  $posts = $stmt->fetchAll(PDO::FETCH_ASSOC);

答案 2 :(得分:0)

这可以帮助您:Mysql prepare statement - Select

使用bindValue()网站(http://php.net/manual/en/pdostatement.bindvalue.php示例#2)的PHP示例:

<?php
/* Execute a prepared statement by binding PHP variables */
$calories = 150;
$colour = 'red';
$sth = $dbh->prepare('SELECT name, colour, calories
    FROM fruit
    WHERE calories < ? AND colour = ?');
$sth->bindValue(1, $calories, PDO::PARAM_INT);
$sth->bindValue(2, $colour, PDO::PARAM_STR);
$sth->execute();
?>

在此示例中,他们在parameter type语句中指定bindValue(),例如PDO::PARAM_STRPDO::PARAM_INT。您也可以尝试指定参数。

或者您也可以使用bindParam(':placeholder',$variable_or_value);http://www.w3schools.com/php/php_mysql_prepared_statements.asp

准备语句和绑定值

预备语句用于使用不同或更改的值多次执行相同的查询。它提供更高的效率。对于简单或随机查询,不需要准备语句,因为它只会降低效率,从而为准备工作创造开销。准备好的陈述通常适用于INSERTUPDATE陈述

答案 3 :(得分:0)

我想你想做的可能是:

$stmt = $conn->prepare('SELECT * FROM posts WHERE post_id = ?');
//Use 's' for a string or 'i' for an integer
$stmt->bind_param('s', $postid);

$stmt->execute();

$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) 
{ }