2009-03-09 25 views
5

Nó sẽ được dễ dàng hơn để giải thích với các mã tiếp theo (Đó là sai, bằng cách này):PHP và MYSQLi - Ràng buộc các tham số sử dụng vòng lặp và lưu trữ trong mảng?

 $selectGenre_sql = 'SELECT genreID FROM genres WHERE dbGenre = ?'; 

     if ($stmt->prepare($selectGenre_sql)) { 
     // bind the query parameters 
     $stmt->bind_param('s', $genre); 
     // bind the results to variables 
     $stmt->bind_result($genres); 
     // execute the query 
     $stmt->execute(); 
     $genre = array(); 
      while ($stmt->fetch()) { 
       $genre[] = $genres; 
      } 
     } 

Đoạn mã trên được giá trị từ 'genreID' khi 'dbGenre' bằng '$ genre'. Và sau đó lưu trữ các kết quả trong một mảng. Nhưng tôi không làm việc. Tại sao? Tôi nghĩ bởi vì '$ genre' là một mảng, vì vậy tôi cần phải lặp lại máng nó để có được một giá trị khác nhau từ 'genreID' mỗi lần.

$ genre là một mảng liệt kê chứa nhiều thể loại phim, ví dụ:

[0] => Hành động [1] => Adventure [2] => Ảo

Tôi cần phải so sánh de giá trị (như 'hành động' ví dụ)

bảng 'thể loại' chứa hai cột: genreID (INT)dbGenre (VARCHAR)

Tôi chỉ cần mỗi genreID (đó là một số) .... Cho phép nói .. khi dbGenre bằng Action, sau đó lưu trữ thể loạiID trong mảng1 và sau đó lặp mảng $ genre để lấy thể loạiID cho giá trị tiếp theo và lưu trữ lại trong mảng1

Làm cách nào để khắc phục sự cố? Tôi mới lập trình vì vậy hãy làm chi tiết nhất có thể. Cảm ơn!!

Trả lời

8

Bạn không thể liên kết mảng với tham số SQL. Bạn có thể sử dụng tham số trong SQL thay cho giá trị bằng một chữ đơn. Không phải danh sách giá trị hoặc biểu thức hoặc tên cột hoặc tên bảng.

Để giải quyết nhiệm vụ trong trường hợp của bạn, bạn có thể sử dụng một trong hai giải pháp:

giải pháp đầu tiên: loop trên $genre mảng, ràng buộc mỗi giá trị cùng một lúc, và thực hiện truy vấn SQL cho mỗi giá trị.

if ($stmt->prepare($selectGenre_sql)) { 
    $genre = array(); 
    foreach ($gengre as $genreID) { 
    $stmt->bind_param('s', $genreID); 
    $stmt->execute(); 
    $stmt->bind_result($genres); 
    while ($stmt->fetch()) { 
     $genre[] = $genres; 
    } 
    } 
} 

Giải pháp thứ hai: thực hiện truy vấn một lần, với nhiều thông số, một cho mỗi giá trị trong mảng. Điều này đòi hỏi một số mã khó khăn để xây dựng một số biến số ? trình giữ chỗ trong truy vấn SQL, được phân tách bằng dấu phẩy.

$selectGenre_sql = 'SELECT genreID FROM genres WHERE dbGenre IN (' 
. join(',', array_fill(0, count($genre), '?')) . ')'; 

if ($stmt->prepare($selectGenre_sql)) { 
    $genre = array(); 
    . . . 

Ngoài ra, bạn cần phải nhận được khéo léo gọi bind_param() với một số biến của tham số dựa trên các yếu tố trong $genre mảng của bạn:

. . . 
    call_user_func_array(array($stmt, 'bind_param'), 
    array_unshift($genre, str_repeat('i', count($genre))); 

    $stmt->execute(); 

    $stmt->bind_result($genres); 

    while ($stmt->fetch()) { 
    $genre[] = $genres; 
    } 
} 

Bạn có thể muốn xem xét sử dụng PDO::mysql vì nó dễ dàng hơn để ràng buộc thông số từ một mảng. Giao diện MySQLi khá lúng túng trong trường hợp này.

0

Một vài điều.

  • Có thể nào không phải vì bạn ghi đè $ genre var, hãy thử đổi thành $ genreArray trong trường hợp sedond?
  • Hãy chắc chắn rằng cơ sở dữ liệu là thực sự trở về vật (thử nó trong phpMyAdmin hoặc một cái gì đó tương tự)

  • chế biến Hãy thử như thế này:

.

$genreId = -1; 
$stmt->bind_results($genreId); 
$stmt->execute(); 
while($stmt->fetch()){ 
    $genreArray[] = $genreId; 
} 
+0

Tôi chỉ cần mỗi genreID (đó là một số) .... Cho phép nói .. khi dbGenre là bằng hành động, sau đó lưu trữ thể loạiID trong mảng, và sau đó vòng lặp để có được thể loạiID cho giá trị mảng tiếp theo .. – Jonathan

+0

ah được rồi, tôi sẽ chỉnh sửa câu trả lời của tôi. –

3

@ Bill Karwin

call_user_func_array sẽ không vượt qua được args bằng cách tham khảo, nó sẽ vượt qua các giá trị công việc nên sẽ không! nó sẽ cho bạn stmt-> lỗi bind_param

PDO của nó không phải là một giải pháp tốt hơn ... u vẫn phải làm một workaround cho rằng quá

này cần được chỉnh sửa trong ur bài:

if($stmt = ...same as yours) { 
array_unshift($genre, str_repeat('i', count($genre))); 
$temp = array(); 
foreach($genre as $key => $value) { 
    $temp[$key] = &$genre[$key]; 
} 
call_user_func_array(array($stmt, 'bind_param'), $temp); 
etc... 
} 
+0

Tôi nghĩ '&' cũng được yêu cầu trước '$ value' trong' foreach': 'foreach ($ genre là $ key => & $ value) {' –

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