PHP准备和执行

时间:2015-09-24 08:37:12

标签: php mysql

我使用以下代码在数据库中执行查询:

$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";
}

正在工作:)只需要知道这是否是一个好的和安全的做法

2 个答案:

答案 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 {}块中。 它会对你有用。