数据库没有';即使使用了mysqli_real_escape_string,也不允许使用特殊字符


database doesn't allow special chars even after using mysqli_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);

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

现在,您正在发送text5=lkf+alu@craftwebart.com——在这个URL上下文中,+是空格字符的"替换"字符。这就是为什么您的脚本将空格字符插入到数据库中,并不是因为插入数据库本身有问题。(尽管如前所述,将mysqli_real_escape_string与prepared statements组合使用是错误的。mysqli_real_escape_string用于屏蔽直接插入SQL语法中的特殊字符,这样它们就不会与实际的SQL语法混淆。然而,当使用带有占位符的prepared语句时,SQL命令和数据会被单独发送到数据库,这样就不会有危险。)s在此上下文中不存在。)

所以,你需要使用

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

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

EDIT:在准备好的语句中似乎传递了一个额外的变量,您需要2个变量,但您传递的是3个,从绑定语句中删除"si"应该可以修复它。

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

旧答案:我认为以前的答案不正确(对不起!):

mysqli_real_escape_string()函数只删除任何特殊字符,这就是它在您的情况下所做的,您应该使用htmlentities()将这些特殊字符转换为HTML实体。

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

这将把一个"+"变成一个应该能够添加到数据库中的"&#43;"。