$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
,但我知道它可能很容易受到攻击。
任何人都可以帮我理解如何正确地进行这些查询吗?
答案 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_STR
和PDO::PARAM_INT
。您也可以尝试指定参数。
或者您也可以使用bindParam(':placeholder',$variable_or_value);
(http://www.w3schools.com/php/php_mysql_prepared_statements.asp)
预备语句用于使用不同或更改的值多次执行相同的查询。它提供更高的效率。对于简单或随机查询,不需要准备语句,因为它只会降低效率,从而为准备工作创造开销。准备好的陈述通常适用于INSERT
和UPDATE
陈述
答案 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())
{ }