2013-03-15 143 views
-1

我找不到为什么mysqli_real_escape_string在向数据库输入数据时不加斜杠。我检查了手册,它说
mysqli_real_escape_string需要有2个参数。其他参数是你的数据库连接,当我检查数据库中的数据时,我发现单引号和没有反斜杠添加。下面的代码可能有问题。我不知道如何使用准备好的语句,请任何帮助..!mysqli_real_escape_string(),不添加反斜杠

function open_handler() 
{ 
      // Connects to MYSQL 
      $connect = new mysqli(HOST,USER,PASS,DB); 

      // Logic Checks 
      if($connect) 
      { 
       // MYSQL SET TO UTF8 ENCODING 
       @mysqli_query('set names "utf-8"'); 
       @mysqli_query('set character set "utf8"'); 
       @mysqli_query('set character_set_server="utf8"'); 
       @mysqli_query('set collation_connection="utf8_general_ci"'); 
      } 

      if(!$connect) 
      { 
       die('UNABLE TO CONNECTION TO MYSQL SERVER'); 
      } 

      return $connect;  

     } 

function add_user($uname,$pwd,$email) 
    { 
     $n_uname = mysqli_real_escape_string(open_handler(),$uname); 
     $n_pwd  = $pwd; 
     $n_email = $email;  

     $sql = sprintf("INSERT INTO `users` SET 
              `uname`='%s', 
              `pwd`='%s', 
              `email`='%s', 
               $n_uname,$n_pwd,$n_email); 
     $query = mysqli_query(open_handler(),$sql); 

     // logic check 
     if(!$query) 
      {return FALSE;} 
     else 
      {return TRUE;} 
     @mysqli_free_result($query); 

    } 
+2

'open_handler()'正在一*** ***新的连接每次它叫!不要这样做。将'$ connect'保存在可以重新使用的地方。 – 2013-03-15 14:11:24

+2

***为什么***使用'@'来压制错误? – Kermit 2013-03-15 14:13:41

+0

[伟大的逃避现实(或:你需要知道如何处理文本中的文本)](http://kunststube.net/escapism/) – deceze 2013-03-15 14:23:46

回答

4

mysqli_real_escape_string()逃脱SQL破字符,如单引号,但只能在数据库事务的功能。换句话说,它不会永久修改您的数据以包含反斜杠。

这使您可以安全地插入/更新/查询您的数据库,而无需修改您的数据。

如果需要有数据以更“永久”时尚反斜线逃跑了,你可以使用addslashes(),然后当你想删除它们,你可以使用stripslashes()

替代mysqli_real_escape_string(),使用prepared statement

$conn = open_handler(); 
$stmt = mysqli_prepare($conn, "INSERT INTO users (uname, pwd, email) VALUES (?, ?, ?);"); 
mysqli_stmt_bind_param($stmt, "s", $uname); 
mysqli_stmt_bind_param($stmt, "s", $pwd); 
mysqli_stmt_bind_param($stmt, "s", $email); 
mysqli_stmt_execute($stmt); 
mysqli_stmt_close($stmt); 
+0

感谢男人重播,所以你的意思是我应该这样做 $ n_uname = addslashes($ uname); – 2013-03-15 14:20:56

+0

我刚刚那样做了,但是,当我添加单引号时,它不会为其添加斜线, – 2013-03-15 14:22:03

+0

@MohammedAllam:你认为“应该”是什么意思? 'addslashes'是不需要的。没有理由让你的报价一旦已经在数据库中就被转义了。你为什么需要你的报价有反斜杠? – 2013-03-15 14:22:32