将查询转换为参数化查询

时间:2016-11-13 00:46:56

标签: php mysql prepared-statement

我的网站上有查询,最近因为它被黑了。

我花了2个小时看看如何转换这个查询,因此它是安全的,没有任何地方。

如果有人不介意的话,请你帮我换一下这个,这样我就可以看看其余的怎么做了?

$camera_id = $_GET['camera_id'];

$cameras = mysqli_query($conn, "SELECT * FROM cameras WHERE id = $camera_id");
$camera = mysqli_fetch_array($cameras);

2 个答案:

答案 0 :(得分:1)

尝试这样的事情。

$camera_id = $_GET['camera_id'];

$cameras = mysqli_prepare($conn, "SELECT * FROM cameras WHERE id = ?");
mysqli_stmt_bind_param($cameras, $camera_id);
$cameras->execute();

在进行切换时,请立即切换到PDO。它比mysqli好得多。

   $db = new PDO('mysql:host=localhost;dbname=mydb', 'username', 'password');
   $stmt = $db->prepare("SELECT * FROM cameras WHERE id = :camera_id");
   $stmt->execute(array(":camera_id"=>$camera_id));
   $result = $stmt->fetchAll();

或代替fetchAll()

while($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
    echo $row['field1'].' '.$row['field2']; //etc...
}

正如您所看到的,这更具可读性。如果你以后决定改用postgresql,那么改变就很容易了。

答案 1 :(得分:1)

这是使用PDO并假设摄像机ID是一个数字(如果它可以包含非数字值,则将PARAM_INT交换为PARAM_STR。基本前提是您将查询与变量分开并绑定值变量所需的项目。另请注意,您需要更改新PDO声明中的变量以适合您自己的数据库。另请注意,fetchAll()提供了返回结果的关联数组 - 还有许多其他获取()方法可能给出不同的结果 - 寻找官方文档。

$camera_id = $_GET['camera_id'];

$conn = new PDO('mysql:host=localhost;dbname=db', 'username', 'password');

$sql = "SELECT * from cameras where id = :cameraId";
$q = $conn->prepare($sql);
$q -> bindValue(":cameraId" , $camera_id, PDO::PARAM_INT);
$q->execute();
$cameraRows = $q->fetchAll();
  foreach($cameraRows as $cameraRow){
    $CID= $cameraRow["camera_id"];
    //.... rest of the code
  }