我使用以下代码在数据库中执行查询:
$sql = "SELECT * FROM cc_topchoices WHERE location='$location' ORDER BY position asc";
$result = mysqli_query($conn, $sql);
我已经读过这种查询方式不安全所以我想在php中使用语句prepare()
和execute()
现在我的代码看起来像这样:
$sql = "SELECT * FROM cc_topchoices WHERE location=:location ORDER BY position asc";
$stmt = $conn->prepare($sql);
$stmt->execute(array(":location" => $location));
$result = mysqli_query($conn, $stmt);
但是这给了我这个错误:
致命错误:在布尔值
上调用成员函数execute()有什么想法吗?
修改
现在我的代码看起来像这样:
// Create connection
$conn = new PDO("mysql:host=$servername;dbname=$dbname", "$username", "$password");
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$conn->exec("set names utf8"); //BECAUSE I NEED TO WORK WITH CHINESE LANGUAGE
$sql = "SELECT * FROM cc_topchoices WHERE location=? ORDER BY position asc";
$stmt = $conn->prepare($sql);
$stmt->bindParam(':location', $location);
$stmt->execute(array($location));
$result = $stmt->setFetchMode(PDO::FETCH_ASSOC);
if ($result > 0) {
// output data of each row
while($row = $stmt->fetch()) {
echo "<li><div><a href='". $row["rest_url"] ."'><img src='images/top_choices/". $row["image"] ."' alt='". $row["alt_desc"]. "' /></a></div></li>";
}
} else {
echo "0 results";
}
正在工作:)只需要知道这是否是一个好的和安全的做法
答案 0 :(得分:5)
PDO支持命名参数。 MySQLi没有。 $stmt
false
向您显示您尝试准备的SQL语法格式错误。使用?
代替:location
。查看MySQLi手册以了解使用MySQLi的正确方法。或者,或者,切换到PDO。
答案 1 :(得分:-2)
如果查询返回单行,请在使用pdo语句时使用以下代码获取记录而不是mysqli_query。
$result = $stmt->fetch(PDO::FETCH_ASSOC);
echo $result['db_column'];
如果返回多行:
$stmt->setFetchMode(PDO::FETCH_ASSOC);
while ($result = $stmt->fetch()) {
echo $result['db_column'];
}
还有一件事,总是将你准备好的陈述放在try {} .. catch {}块中。 它会对你有用。