包含引号和双引号的

时间:2017-04-25 19:00:35

标签: php mysql

我正在尝试将数据插入包含引号和双引号的表中。我怎么能逃脱他们?

我要添加的值是:

 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部分会被破坏。如果我使用双引号,琼斯部分就会被破坏。

我知道它的数据库设计非常糟糕,但是我无法控制我需要添加的字段或值的语法。我必须完全按照上面的说法插入值。

3 个答案:

答案 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