2011-01-19 33 views
9

Tôi đang sử dụng mysql_real_escape_string để thoát khỏi chuỗi trước khi chèn nó vào cơ sở dữ liệu mysql của tôi.mysql_real_escape_string và '

Mọi thứ hoạt động tốt, ngoại trừ ký tự bị bỏ qua và chuyển thành ’ bởi mysql.

Tôi có thể làm gì để giải quyết vấn đề? Tôi có nên sử dụng một chức năng tốt hơn để thoát khỏi chuỗi?

Tôi cũng lo lắng rằng các tay đua khác có thể bị lạc và bị biến thành vô nghĩa!

Vui lòng trợ giúp!

Cảm ơn :)

Trả lời

16

Ký tự 'không bị bỏ qua, nó chỉ đơn giản là một ký tự không được mysql sử dụng để bao bọc chuỗi và không cần phải được thoát.

Lý do nó biến thành chuỗi lạ đó là vì nó là ký tự nhiều byte và bạn đặt nó vào một trường byte đơn.

+8

để làm rõ, có sự khác biệt giữa 'và' – dqhendricks

+2

+1 Cũng có thể là sự cố mã hóa máy khách/máy chủ (ví dụ: 'SET NAMES'). – netcoder

+0

cảm ơn. do đó, việc thiết lập mã hóa trường thành utf-8 sẽ khắc phục bất kỳ vấn đề nào như thế này? – significance

4

Bạn nên sử dụng chuẩn bị phát biểu với các biến ràng buộc thay vì: http://php.net/manual/en/pdo.prepared-statements.php Bằng cách này bạn không cần phải lo lắng về bất cứ điều gì thoát. Những lợi thế được đề cập trong tài liệu tôi liên kết đến.

+0

Điều này dường như rõ ràng là tốt hơn so với bất kỳ số lượng trích dẫn nào, tôi choáng váng rằng nhóm PHP đã không xóa 'mysql_real_escape_string()' như một nỗ lực đầu tiên ngớ ngẩn. – sarnold

2

mysql_real_escape_string() chỉ cần thoát một số ít ký tự (sử dụng \ 's) để làm cho chúng "an toàn" để đưa vào truy vấn của bạn. Dường như mã hóa của bạn không khớp với dữ liệu của bạn (báo giá được tạo kiểu) và loại mã hóa cột của bạn. mysql_real_escape_string sẽ không bao giờ giải quyết loại vấn đề đó.

+0

không được truy vấn nhưng vào chuỗi được phân tách bằng dấu ngoặc kép trong truy vấn. cảm nhận sự khác biệt –

1

Đó có phải là một câu nói ưa thích không? Nếu vậy, nó có thể trông giống như vô nghĩa trong cơ sở dữ liệu của bạn do sự khác biệt mã hóa ký tự. Mỗi bảng có mã hóa ký tự liên quan và kết nối có mã hóa riêng.

Thử thực hiện "SET NAMES utf8" trước truy vấn của bạn. Điều đó sẽ đặt mã hóa kết nối thành UTF-8. Tất nhiên, nếu bạn đang cố gắng lưu trữ các ký tự UTF-8 vào, nói một bảng latin1, bạn sẽ vẫn không nhận được kết quả mong đợi.

0

Đó là một nhân vật đặc biệt cho điều này bạn cần phải sử dụng UTF Encoding

Nơi dòng này ở phía trên cùng của trang mà bạn đang chèn dữ liệu trong cơ sở dữ liệu

header ('Content-type: text/html; charset=utf-8'); 

Hy vọng nó hoạt động

-1
mysql_real_escape_string(utf8_encode($data)); 

Hy vọng điều này sẽ hiệu quả.

-1
<?php 
    if(isset($_GET['submit'])) 
    { 
     mysql_connect('localhost','root',''); 
     mysql_select_db('test'); 
     $var=mysql_real_escape_string($_GET['asd']); 
     $sql="INSERT INTO `test`.`asd` (`id` ,`name` ,`desc`)VALUES ('', '$var', 'knkk');"; 
     echo $sql."<br />"; 
     $res=mysql_query($sql) or die('error'); 
     echo $res; 
    } 
?> 

<html> 
<body> 
    <form name="f1" method="get"> 
     <input type="text" name="asd"> 
     <input type="submit" name="submit"> 
    </form> 
</body> 
</html> 

Output:

INSERT INTO test.asd (id, name, desc) VALUES ('', 'asd \' lgh ',' knkk ');

enter image description here

0

Nó sẽ làm việc trong trường hợp bạn đã thiết lập kết nối mysql với: mysql_query ("SET 'utf8' TÊN");

Nói cách khác, nếu SET NAMES 'utf8' không được đặt, utf8_encode là không cần thiết.

Các vấn đề liên quan