簡體   English   中英

數據庫即使使用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與預處理語句結合使用錯誤的mysqli_real_escape_string用於屏蔽直接插入SQL語法中的特殊字符,以免將它們與實際的SQL語法混淆。但是,占位符會將SQL命令和數據彼此分開發送到數據庫,因此在這種情況下不存在危險。)

因此,您需要使用

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

將您的數據發送到服務器。 encodeURIComponent負責為URL上下文正確編碼數據。 它將+字符變成%2B ,以便可以在該上下文中安全地發送它,PHP會將其自動解碼回+

編輯:看來您在准備好的語句中傳遞了一個附加變量,您期望有2個變量,但是您傳遞了3個,從bind語句中刪除“ 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; ”,應該可以將其添加到數據庫中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM