我正在尝试将数据插入包含引号和双引号的表中。我怎么能逃脱他们?
我要添加的值是:
default=1,name='Bob',lastName="Jones"
$ins = "INSERT into table (field1,field2,fiel3,) values ('data1','data2',????)";
如果我使用单引号,Bob部分会被破坏。如果我使用双引号,琼斯部分就会被破坏。
如果我使用mysql_escape_string会是什么样的?
$data3 = mysql_escape_string(????);
再次,如果我使用单引号,Bob部分会被破坏。如果我使用双引号,琼斯部分就会被破坏。
我知道它的数据库设计非常糟糕,但是我无法控制我需要添加的字段或值的语法。我必须完全按照上面的说法插入值。
答案 0 :(得分:2)
使用预备陈述
看看这个。
首先使用改进的mysqli
$mysqli = new mysqli($servername, $username, $password);
$stmt = $mysqli->prepare("INSERT into table (field1,field2,fiel3,) values (?,?,?)");
$stmt->bind_param("sss",$data1,$data2,$data3);
$stmt->execute();
$mysqli
是您的连接器。
这样你也防止了SQL注入。
答案 1 :(得分:2)
从我读过的mysql_*
函数到PHP 7已被弃用,据我所知,你无法逃避引号。至少不正确。我建议你去PDO,因为它与不同的数据库类型兼容,并且在我看来比mysqli_*
函数更容易使用。虽然我会告诉你mysqli
能够逃避引用。
由于已经有一个mysqli示例的答案,这里有一个使用PDO来转义引号的简短示例:
$dns = "mysql:dbname=test;host=localhost";
$user = "root";
$password = "";
$connection = new PDO($dns, $user, $password);
$sql = "INSERT INTO users (username, password) VALUES (:username, :password)";
$statement = $connection->prepare($sql);
$statement->execute([
':username' => $username,
':password' => $password
]);
现在请记住这只会转义引号,它不会过滤您的输入。因此,在插入任何外部数据(表单数据)之前,请根据要过滤的内容使用filter_var()
函数,例如:$string = filter_var($string, FILTER_SANITIZE_STRING)
。或者你可以这样做:
$statement->bindParam(':username', $username, PDO_PARAM_STRING);
答案 2 :(得分:0)
只是一个模仿原始mysql_real_escape_string但不需要活动的mysql连接的小函数。可以作为数据库类中的静态函数实现。希望它可以帮助某人。
<?php
function mysql_escape_mimic($inp) {
if(is_array($inp))
return array_map(__METHOD__, $inp);
if(!empty($inp) && is_string($inp)) {
return str_replace(array('\\', "\0", "\n", "\r", "'", '"', "\x1a"), array('\\\\', '\\0', '\\n', '\\r', "\\'", '\\"', '\\Z'), $inp);
}
return $inp;
}
?>
来源:php manual