10/10/2018, 09:41

thêm chữ unicode vào DB, php, preg_match

Chào các bác,

Các bác có thể giúp em 1 chút về PHP kg? Mình muốn add content vào DB và có thể hiện ra trên web php những ký tự tiếng Việt như (â, ế, đ…) mà không phải là (#, %, &...)

Vậy...
1. Mình set DB thành utf8_general_ci, như thế có đúng kg?
2. Mình có đoạn code php để thêm từ vào DB, nhưng nó kg cho phép chữ có khoảng trắng và có dấu. Mình phải sửa như thế nào? Để có thể thêm khoảng trắng và ký tự (â, ế, đ…) mà không phải (#, %, &...)

PHP Code:
function them_vao($word){
    if (
preg_match('/^***91;a-zA-Z***93;+$/'$_POST***91;'word'***93;)) {
        
$word $_POST***91;'word'***93;;
    } else {
        echo 
'Sai!';
        exit();
    }

    if (
add_word($word)) {
        echo 
"<p>Da them vao! </p>";
    } else {
        echo 
"<p>Khong the them vao! </p>";
    }
    echo 
"<b>Chu:</b> $word<br/>";

Mong các bác giúp mình
fotech_nd viết 11:53 ngày 10/10/2018
1. Mình set DB thành utf8_general_ci, như thế có đúng kg? => Với tiếng Việt thì hiện tại đây mới chỉ là cách tối ưu nhất, vì MySQL chưa support Vietnamese language collation (Anh em vào http://bugs.mysql.com/bug.php?id=4745 để cùng kiến nghị thì may ra mới đc support )
2. Sửa lại hàm them_vao như sau:
PHP Code:
function them_vao($word){
    
/*if (preg_match('/^***91;a-zA-Z***93;+$/', $_POST***91;'word'***93;)) {
        $word = $_POST***91;'word'***93;;
    } else {
        echo 'Sai!';
        exit();
    }*/
    
$word addslashes($_POST***91;'word'***93;);

    if (
add_word($word)) {
        echo 
"<p>Da them vao! </p>";
    } else {
        echo 
"<p>Khong the them vao! </p>";
    }
    echo 
"<b>Chu:</b> $word<br/>";

kcreative viết 11:53 ngày 10/10/2018
cám ơn bác. Nhưng nếu sửa vậy thì user vẫn thêm vào các ký tự như $%^&*. Set cái preg_match ntn để nó chặn các ký tự này?

Mình có thử edit như bạn nói. Sau đó thử add tiếng việt vào, nó ra các ký tự ntn �� mặc dù charset của web là unicode rồi. Làm thế nào để hiện đúng nhỉ?
fotech_nd viết 11:43 ngày 10/10/2018
1. Sửa hàm them_vao như sau:
PHP Code:
function them_vao($word){
    if (!
preg_match('/***91;\~\`\!\@\#\$\%\^\&\****93;+/'$_POST***91;'word'***93;)) {
        
$word $_POST***91;'word'***93;;
    } else {
        echo 
'Sai!';
        exit();
    }
    
$word addslashes($word);

    if (
add_word($word)) {
        echo 
"<p>Da them vao! </p>";
    } else {
        echo 
"<p>Khong the them vao! </p>";
    }
    echo 
"<b>Chu:</b> $word<br/>";

2. Kiểm tra các đầu mục sau đây nhé:

- Đặt Colation của DB là utf8 (đặt là utf8_general_ci là Okie rùi)

- Khi mở kết nối, đảm bảo chắc chắn rằng việc kết nối đến DB đúng là utf8, nếu không chắc chắn thì thực hiện các query dưới đây sau khi Open Connection (tức là thực hiện các query này trước khi thực hiện các query khác)
PHP Code:
mysql_query("SET NAMES utf8");
mysql_query("SET CHARACTER SET utf8");
mysql_query("SET COLLATION_CONNECTION='utf8_general_ci'"); 
- Tại phía client đảm bảo rằng dữ liệu đc encoding ở dạng utf-8 (Thêm thẻ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
vào trong thẻ <head>)
kcreative viết 11:44 ngày 10/10/2018
Mình có thể viết các dòng query ntn kg?

PHP Code:
$sql "SET NAMES utf8";
$sql "SET CHARACTER SET utf8"
$sql "SET COLLATION_CONNECTION='utf8_general_ci'";
$sql "SELECT * FROM `words` WHERE (SELECT `word` LIKE '%$word%') AND (`url` = 'none') AND (`word` != '$word') LIMIT 0, 20";
$results mysql_query($sql); 
Bài liên quan
0