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

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

我在 SO 上发现了很多这样的问题并遵循了解决方案,但在我的情况下没有用。

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

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

但这不会插入 +。它会在数据库中提供空白空间。

请注意,我正在使用准备语句参数化查询。这是数据库不允许+的原因吗?如果是,我该如何解决?

感谢您的宝贵时间。

代码

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 与准备好的语句结合使用 是错误的。mysqli_real_escape_string 用于屏蔽插入到 SQL 中的特殊字符直接语法,这样它们就不会与实际的 SQL 语法混淆。但是,当使用带占位符的准备语句时,SQL 命令和数据将彼此分开地发送到数据库,因此在这种情况下不存在危险。)

所以,你需要使用

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

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

关于php - 即使在使用 mysqli_real_escape_string 之后,数据库也不允许特殊字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29178824/

相关文章:

php - 即使phpMyAdmin连接也无法连接到PHP中的mysql_connect

php - 性能 : SQL Queries vs Server-Side PHP Loops (MYSQL vs PHP)

php - 内存不足和允许的 * 字节内存大小之间的差异耗尽

mysql - 如何在 bash/mysql 脚本中引用 .my.cnf 的位置?

使用 toSource() 的 Javascript 对象序列化将特殊字符转换为十六进制代码 - 如何反转?

mysql - REPLACE 查询不会替换所有提到的字符

php - 空格自动添加输入php

php - 从数据库格式化文本

php - 将时间戳排序为间隔 PHP

python - 检查字符串何时仅包含python中的特殊字符