2012-02-24 30 views
8

Tôi cần CHỌN với danh sách mảng. $array_name chứa:Mảng trong Mysql Ở ĐÂU?

Array ([0] => gum.cn [1] => lol.com. [2] => ns1.blar.com [3] => test.com [4] => web.cn.) 

print_r ($ array_name);

$string = implode(',',$array_name); 


    $tank = "SELECT url FROM `PHP`.`db` WHERE url LIKE '%{$string}%'"; 
    $result1 = mysql_query($tank); 
     while ($jwp = mysql_fetch_array($result1)) 
     {  
     echo $jwp['url']; 
     echo "<br>"; 
     } 

Tại sao không phải là công việc trên? Tôi tìm kiếm ví dụ khác và câu hỏi được hỏi mà không sử dụng mệnh đề LIKE do đó không có giải pháp ở đó. Xin vui lòng giúp đỡ, cảm ơn trước.

+1

Câu trả lời hay cho câu hỏi tương tự ở đây: http://stackoverflow.com/questions/1127088/mysql-like-in – lamplightdev

+0

@lamplightdev: REGEXP là một lựa chọn tốt, nhưng không may ở đây, đó là các miền chứa '.' ký tự, đó là các ký tự đại diện trong regex. Bạn có thể thoát khỏi chúng, nhưng nó quá nhiều công việc cho một vấn đề tầm thường như vậy IMO. Mặc dù nó có thể được xem xét. – netcoder

Trả lời

30

Nó không làm việc vì truy vấn của bạn sẽ mở rộng tới:

SELECT url FROM `PHP`.`db` WHERE url LIKE '%gum.cn,lol.com.,ns1.blar.com...%' 

Bạn phải thay đổi truy vấn của bạn một chút:

$query_parts = array(); 
foreach ($array_name as $val) { 
    $query_parts[] = "'%".mysql_real_escape_string($val)."%'"; 
} 

$string = implode(' OR url LIKE ', $query_parts); 

$tank = "SELECT url FROM `PHP`.`db` WHERE url LIKE {$string}"; 
+0

Hey, cảm ơn bạn rất nhiều. Nó hoạt động ngay bây giờ nhưng tôi không hiểu điều này, '$ string = implode ('HOẶC url LIKE', $ query_parts);' tại sao bạn cần loại bỏ ''HOẶC url LIKE'' bao gồm cả khoảng trắng? Tôi hy vọng bạn có thể giải thích và cảm ơn thời gian của bạn. – sg552

+1

@ sg552: Nó không xóa nó, * nó thêm nó *. Đặt truy vấn vào màn hình và có thể bạn sẽ hiểu. – netcoder

+0

Sau tất cả những lần này, tôi nghĩ 'implode()' giả sử là loại bỏ dấu phẩy hoặc khoảng trắng khỏi mảng. Tôi nhận được đầu ra là: '% gum.cn% 'HOẶC url LIKE'% lol.com.% 'HOẶC url LIKE'% blar.com% 'HOẶC url LIKE'% test.com% 'HOẶC url LIKE'% web .cn.% 'Nếu tôi hiểu chính xác MySQL giải thích biến' $ string' là một chuỗi dài và nếu tôi có 1000 tên miền thì sẽ có 1000 tên miền được thực hiện trong 1 truy vấn? Chính xác? Cảm ơn bạn đã dành thời gian. – sg552

0

Nó sẽ không hoạt động vì nó sẽ cố gắng và phù hợp với giá trị cơ sở dữ liệu (ví dụ) 'gum.cn' với '% gum.cn, lol.com, .....%', mà sẽ không bao giờ đúng.

Thay làm điều này:

foreach ($array_name as $string) { 
    $tank = "SELECT url FROM `PHP`.`db` WHERE url LIKE '%{$string}%'"; 
    $result1 = mysql_query($tank); 
    echo $jwp['url']; 
    echo "<br>"; 
} 

Hy vọng rằng sẽ giúp.

+1

Chạy truy vấn trong một vòng lặp? Đó không phải là một thực hành tốt và không phải nó trả lời câu hỏi của OP :) – Sarfraz

+0

Câu hỏi của OP là giải thích tại sao nó không hoạt động, mà tôi đã làm ở đầu câu trả lời. – ralfe

+1

Khi bạn sẽ có thêm kinh nghiệm, bạn sẽ biết rằng những gì tôi đã nói hôm nay (chạy truy vấn bên trong vòng lặp) là chính xác :) – Sarfraz

1

Bởi vì nó tạo ra SQL không hợp lệ (Được rồi, về mặt kỹ thuật có giá trị, nó chỉ là không làm những gì bạn nghĩ rằng nó sẽ)

SELECT url FROM `PHP`.`db` WHERE url LIKE '%a,b,c,d,%' 

Bạn sẽ có o nối thêm nhiều câu lệnh LIKE. Implode sẽ không hoạt động cho tác vụ này trừ khi bạn đang thực hiện truy vấn đối sánh chuỗi chính xác. Thậm chí sau đó bạn cần phải chỉnh sửa mã.

+0

Đó là SQL hoàn toàn hợp lệ bằng cách này. – netcoder

+1

SQL hợp lệ, nhưng không phải cho những gì anh ta đang cố gắng làm. – JohnFx

0

Sử dụng mệnh đề IN, nhưng đảm bảo rằng các giá trị được trích dẫn và thoát:

//TODO: escape $array_name values 

$string = implode("','",$array_name); //ensure quoted values 

$tank = "SELECT url FROM `PHP`.`db` WHERE url IN ('$string')"; 
0

/** * nổ tung một mảng đa chiều của các giá trị, nhóm ký tự khi khác nhau với "[]" khối. * @param array $ array Mảng để implode * @return string Mảng được mã hóa */ hoArray2SqlLike chức năng ($ array) { if (!is_array ($ array)) trả về mảng $;

$values = array(); 
$strings = array(); 

foreach ($array as $value) 
{ 
    foreach (str_split($value) as $key => $char) 
    { 
     if (! is_array($values[ $key ])) 
     { 
      if (isset($values[ $key ])) 
      { 
       if ($values[ $key ] != $char) 
       { 
        $values[ $key ]  = array($values[ $key ]); 
        $values[ $key ][] = $char; 
       } 
      } 
      else 
       $values[ $key ] = $char; 
     } 
     elseif (! array_search($char , $values[ $key ])) 
      $values[ $key ][] = $char; 
    } 
} 

foreach ($values as $value) 
{ 
    if (is_array($value)) 
     $value = '['.implode('', $value).']'; 

    $strings[] = $value; 
} 

return implode('', $strings); 

}

0

/* Dữ liệu trong mảng */

$array_name = array("gum.cn","lol.com","ns1.blar.com","test.com","web.cn"); 

/* Tham gia các phần tử mảng thành một chuỗi với dấu phân cách (khoảng trắng) "" */

echo $string = implode(" ", $array_name); 
// output: gum.cn lol.com ns1.blar.com test.com web.cn 

/* thay thế dấu cách (khoảng trắng) "" bằng "% 'HOẶC'%" */

echo $string = str_replace(" ", "%' OR '%", $string); 
// output: gum.cn%' OR '%lol.com%' OR '%ns1.blar.com%' OR '%test.com%' OR '%web.cn 

/* Chèn vào sql query */

$tank = "SELECT url FROM `PHP`.`db` WHERE url LIKE 

'% $ string%'

";