2017-04-25 153 views
0

我试图插入数据到包含引号和双引号的表中。我怎么能逃脱他们?Mysql PHP插入引号和双引号

我想补充的值是:

default=1,name='Bob',lastName="Jones" 


$ins = "INSERT into table (field1,field2,fiel3,) values ('data1','data2',????)"; 

如果我使用单引号,鲍勃部分被打破。如果我使用双引号,琼斯部分会被破坏。

如果我使用mysql_escape_string这将看起来像什么?

$data3 = mysql_escape_string(????); 

再次,如果我使用单引号,鲍勃部分被打破。如果我使用双引号,琼斯部分会被破坏。

我知道它是一个可怕的数据库设计,但我无法控制我需要添加的字段或值的语法。我必须完全按照上面所示插入值。

+0

我只是好奇,为什么你会想这样做。 –

+6

**警告**:如果您只是学习PHP,请不要学习过时的['mysql_query'](http://php.net/manual/en/function.mysql-query.php)界面。这很糟糕,并且已经在PHP 7中被删除了。像[PDO不是很难学的东西](http://net.tutsplus.com/tutorials/php/why-you-should-be-using-php-pdo- for-database-access /)以及[PHP The Right Way](http://www.phptherightway.com/)等指南有助于解释最佳实践。让**确定**您的用户参数[妥善转义](http:// bobby-tables。COM/PHP),否则你将以严重的[SQL注入漏洞](http://bobby-tables.com/)结束。 – tadman

+0

@ Fred-ii-因为我添加数据的db是由clowns设计的....任何好的数据库都会将字段3分成单独的字段,但不是这个数据库..... – bart2puck

回答

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注入。

+0

很好的例子,它应该如何处理'mysqli'。 – tadman

+0

是啊!让我编辑显示连接器 –

+2

在那里,现在他有了整个解决方案 –

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); 
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