2009-03-09 10 views
5

Łatwiej będzie wyjaśnić do następnego kodu (To nie tak, przy okazji):PHP i MYSQLi - Parametry powiązania za pomocą pętli i zapisu w tablicy?

 $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; 
      } 
     } 

Powyższy kod pobiera wartość z „genreID” kiedy „dbGenre” jest równe „$ gatunku”. A następnie zapisz wyniki w tablicy. Ale nie działa. Czemu? Myślę, że ponieważ "$ genre" jest tablicą, więc potrzebuję zapętlić ją, aby za każdym razem uzyskać inną wartość od 'genreID'.

$ gatunek jest wyliczeniowy tablica zawierająca gatunki filmowe, na przykład:

[0] => Akcja [1] => Przygodowe [2] => Fantasy

muszę porównać de wartość (jak 'Action' na przykład)

tabela 'gatunków' zawiera dwie kolumny: genreID (int) i dbGenre (VARCHAR)

Po prostu potrzebuję każdego genreID (to jest liczba) ... Powiedzmy .. gdy dbGenre jest równe Action, następnie przechowuj genreID w tablicy 1, a następnie zapętlaj tablicę $ genre, aby uzyskać genreID dla następna wartość i zapisz ją ponownie w tablicy 1

Jak mogę to naprawić? Jestem początkującym programistą, więc proszę być tak szczegółowym, jak tylko potrafisz. Dzięki!!

Odpowiedz

8

Nie można powiązać tablicy z parametrem SQL. Możesz użyć parametru w SQL zamiast pojedynczej wartości literalnej o wartości :. Nie jest to lista wartości ani wyrażenie, ani nazwa kolumny lub nazwa tabeli.

Aby rozwiązać zadanie w przypadku, można skorzystać z jednego z dwóch rozwiązań:

Pierwsze rozwiązanie: pętli nad $genre tablicy, powiązać każdą wartość jeden w czasie i wykonać zapytanie SQL dla każdej wartości.

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; 
    } 
    } 
} 

Drugie rozwiązanie: Wykonaj zapytanie raz, z wieloma parametrami, po jednym dla każdej wartości w tablicy. Wymaga to trochę skomplikowanego kodu, aby utworzyć zmienną liczbę zmiennych zastępczych ? w zapytaniu SQL, oddzielonych przecinkami.

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

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

także trzeba się trudne nazywając bind_param() ze zmienną liczbą argumentów opartych na elementach w swojej tablicy $genre:

. . . 
    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; 
    } 
} 

Można rozważyć użycie PDO::mysql ponieważ łatwiej powiązać parametry z tablicy. Interfejs MySQLi jest dość niezręczny w tym przypadku.

0

Kilka rzeczy.

  • Czy to możliwe, ponieważ nadpisujesz gatunek $ var, spróbuj zmienić go na $ genreArray w przypadku sedond?
  • Upewnij się, że baza danych jest rzeczywiście powrocie rzeczy (spróbuj go w phpMyAdmin lub coś podobnego)

  • przetwarzania Spróbuj tak:

.

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

Po prostu potrzebuję każdego genreID (to jest liczba) ... Powiedzmy .. gdy dbGenre jest równy Action, następnie przechowuj genreID w tablicy, a następnie zapętlaj się, aby uzyskać genreID dla następnej wartości tablicy .. – Jonathan

+0

ah okej, będę edytować moją odpowiedź. –

3

@ Bill Karwin

call_user_func_array nie przejdzie args przez odniesienie, to minie wartości więc przyzwyczajenie praca! da Ci stmt-> Błąd bind_param

pdo jej nie lepsze rozwiązanie ... u nadal trzeba zrobić obejście że zbyt

ten powinien być edytowany w ur postu:

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

Myślę, że '&' również wymagane przed '$ value' w' foreach': 'foreach ($ genre jako $ key => & $ value) {' –

Powiązane problemy