:
$stmtPG = $conn->query("SELECT count(*) FROM myTable WHERE entry_type = 'post'");
$total = $stmtPG->fetchColumn();
并且:
$type = 'post';
$stmtPG = $conn->query("SELECT count(*) FROM myTable WHERE entry_type = '$type'");
$total = $stmtPG->fetchColumn();
查询中的值将不会来自用户。
答案 0 :(得分:1)
无论运行哪种方式,该代码都相同。
但是...
理想情况下,您希望使用位置参数和准备好的语句...这应该可以帮助您,这是我编写的“随便做”功能的部分复制/粘贴,我在任何地方都使用过。强烈建议您自己编写或找到一个(写一次,包括很多,在需要时修复一次!)。
$dbconn = new PDO('mysql:host=' . $hostname . ';port=' . $dbPort . ';dbname=' . $dbName . ';charset=utf8', $username, $password, array(PDO::MYSQL_ATTR_FOUND_ROWS => true));
$dbconn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$query="SELECT count(*) FROM myTable WHERE entry_type = ?");
$parameters=array("post");
$result = $dbconn->prepare($query);
$result->execute($arr);
if(!$result){
die("Query error:".$dbconn->errorInfo());
}
while ($row = $result->fetch(PDO::FETCH_ASSOC)) {
$dataRetrieved[] = $row;
}
编辑-
发问者在下面的评论中提问-“有些人对我说,如果价值不是来自客户端,则不需要放置占位符。您这样做了。为什么?看来每个人有自己的见解...“
嗯...是的。如果您正在运行静态查询,则无需参数化或使用准备好的语句等,因为您可以完全控制正在使用/查询的内容等。
但是回到“一次编写,包括所有地方,需要时在一个地方修复” ...如果我在任何地方都使用我的函数或类,它需要能够处理使用用户生成的输入以及静态且已知安全的查询。因此,即使没有严格要求,也总是要对参数进行参数化。