即使在使用mysqli_real_escape_string之后,数据库也不允许使用特殊字符

时间:2015-03-21 03:12:38

标签: php mysql special-characters mysql-real-escape-string

我在SO找到了很多这样的问题并按照解决方案进行了解决,但在我的案例中并没有起作用。

我想将+插入数据库,所以我使用了

$tex5=mysqli_real_escape_string($connect_dude,$_POST['text5']);

但是这并没有插入+。它在数据库中给出了空白(空白)。

请注意,我正在使用prepared statementparameterized query。这是数据库不允许+的原因吗?如果是,那我该怎么办?解决这个问题?

感谢您的时间。

代码

的Javascript

//call con_edi() on first button clicked.insert email on text field and click button would fire off change5()    

function con_edi(){
   document.getElementById("alu").innerHTML="<input type='text'  id='taxi' style='border:1px solid black;'><input type='submit' id='' onclick='change5(taxi.value)' value='change'>";
 }

function change5(s){
   var form=s;
   if(!form.match(/^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$/)){
      alert("Wrong Email");
   }else{
     //document.write(form);  /*for testing the output*/
     var ajax=new XMLHttpRequest();
     ajax.open("post","contact.php",true);
     ajax.setRequestHeader("content-type","application/x-www-form-urlencoded");
     ajax.onreadystatechange=function(){
       if(ajax.readyState == 4 && ajax.status == 200){

          location.reload();

        }
      }

    ajax.send("text5="+form);
   }
 }

PHP

$tex5=mysqli_real_escape_string($connect_dude,$_POST['text5']);
$query6="UPDATE `$database`.`header` SET email=?  WHERE user_id=?";

mysqli_stmt_prepare($stmt1, $query6);
mysqli_stmt_bind_param($stmt1, "si", $tex5, $logged_id);
mysqli_stmt_execute($stmt1);

2 个答案:

答案 0 :(得分:1)

您需要对要发送的值进行正确的URL编码。

现在,您正在发送text5=lkf+alu@craftwebart.com - 在此网址上下文中,+是空格字符的“替换”字符。这就是为什么你的脚本将空格char插入数据库的原因,而不是因为插入数据库本身存在问题。 (尽管如上所述,将mysqli_real_escape_string与预准备语句结合使用 是错误的。mysqli_real_escape_string用于屏蔽直接插入SQL语法的特殊字符,以便它们不能与实际的SQL语法混淆。当使用带有占位符的预准备语句时,SQL命令和数据会彼此分开发送到数据库,因此在此上下文中不存在危险。)

所以,你需要使用

ajax.send("text5="+encodeURIComponent(form));

将您的数据发送到服务器。 encodeURIComponent负责为URL上下文正确编码数据。它会将+字符变为%2B,以便可以安全地在该上下文中发送,并且PHP会自动将其解码回+

答案 1 :(得分:0)

编辑:看来你准备好的声明中传递了一个额外的变量,你期待2个变量,但是你传递的是3,删除&#34; si&#34;来自bind语句应该修复它。

mysqli_stmt_bind_param($stmt1, $tex5, $logged_id);

老回答:我认为之前的答案是错误的(抱歉!):

mysqli_real_escape_string()函数只删除任何特殊字符,这就是它在您的情况下正在执行的操作,您应该做的是将这些特殊字符转换为具有htmlentities()的HTML实体。

$tex5=mysqli_real_escape_string($connect_dude,htmlentities($_POST['text5']));

哪会变成&#34; +&#34;到&#34; &#43;&#34;应该可以添加到数据库中。