使用mysql_real_escape_string来清除我的查询

ian*_*ian 1 php mysql

这是最好的方法吗?

我应该对每个查询中的每个值执行此操作吗?GET和POST?

是否有addslashes(mysql_real_escape_string())过度杀伤?

Vol*_*erK 6

如果你正在使用mysql_query()那么是的,mysql_real_escape_string()是最好的方法.是的,您必须将它应用于您混合到sql语句中的每个参数.例如

$query = "
  SELECT
     x,y,z
  FROM
     foo
  WHERE
    a = '". mysql_real_escape_string($_POST['a'], $mysql) . "'
    AND b = '". mysql_real_escape_string($_POST['b'], $mysql) . "'
 ";
Run Code Online (Sandbox Code Playgroud)

但您也可以使用预处理语句,例如使用pdo模块.参数将从sql语句中传输,因此不需要转义.它更安全(因为你不能忘记转义或错误/错误的字符集),通常比将参数混合到语句中更快,甚至更简单.例如

$pdo = new PDO('mysql:host=localhost;dbname=test', '..', '..');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$stmt = $pdo->prepare("
  INSERT INTO
    foo (x,y,z)
  VALUES
    (:x,:y,:z)
");

$stmt->bindParam(':x', $x);
$stmt->bindParam(':y', $y);
$stmt->bindParam(':z', $z);

// insert all records (0,0,0) ... (0,1,0) ... (9,9,9)
for($x=0; $x<10; $x++) {
  for($y=0; $y<10; $y++) {
    for($z=0; $z<10; $z++) {
      $stmt->execute();
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

编辑:和addslashes(mysql_real_escape_string())不仅是矫枉过正,而且也是错误的.