PHP ve mysqli - dizi döngü ve mağaza ile Bind parametreleri?

3 Cevap php

Bu (Bu arada, yanlış) bir sonraki kodu ile açıklamak daha kolay olacaktır:

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

'DbGenre' $ türe 'eşit olduğunda Yukarıdaki kod' genreID 'dan değerini alır. Ve sonra bir dizi sonuçları saklayın. Ama i'ts çalışmıyor. Neden? '$ Tarz' bir dizidir çünkü ben düşünüyorum, bu yüzden 'genreID' her zaman farklı bir değer elde etmek için döngü çukur gerekir.

$ Tür, örneğin, film türlerini içeren numaralandırılmış bir dizidir:

[0] => Action [1] => Adventure [2] => Fantasy

Ben (örneğin 'Eylem' gibi) de değerini karşılaştırmak gerekir

genreID (INT) ve dbGenre (VARCHAR): 'türün kendine masa iki sütun içerir

I just need each genreID (that is a number).... Lets say.. when dbGenre is equal to Action, then store the genreID in an array1, and then loop the $genre array to get the genreID for the next value and store it again in array1

Bunu nasıl düzeltebilirim? Ben bu yüzden mümkün olduğunca detaylı olarak lütfen programlama yeniyim. Teşekkürler!

3 Cevap

Bir SQL parametresine bir dizi bağlamak olamaz. Bir single literal value yerine SQL bir parametre kullanabilirsiniz. Değil bir değerler listesi, ya da bir ifade, ya da bir sütun adı veya tablo adı.

Sizin durumunuzda görevi çözmek için, iki çözümlerden birini kullanabilirsiniz:

Birinci çözüm: $genre dizi üzerinde döngü, bir anda her değer bir bağlama ve her değer için SQL sorgusu çalıştırmak.

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

İkinci çözüm: birden fazla parametre, dizideki her değer için biri ile, bir kez sorguyu yürütmek. Bu virgülle ayırarak SQL sorgusunda ? tutucuların, değişken bir dizi oluşturmak için bazı zor kod gerektirir.

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

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

Ayrıca size $genre dizideki elemanlarına dayalı bağımsız değişken bir dizi ile zor arama bind_param() almak gerekir:

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

Bunu bir diziden parametreleri bağlamak için kolay, çünkü PDO::mysql kullanarak düşünebilirsiniz. MySQLi arayüzü bu durum için oldukça garip.

@ Bill Karwin

call_user_func_array bunu alışkanlık iş değerlerini geçecek, referans args yummayacağız! size stmt-> bind_param hata verecektir

PDO onun değil iyi bir çözüm ... u hala bunun için de bir çözüm yapmak zorunda

Bu ur yazı düzenlenmesi gerekir:

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

Bir kaç şey.

  • Senin $ tür VAR yazılmadan çünkü is't olabilir, sedond durumda $ genreArray bunu değiştirmenin deneyin?
  • Veritabanı gerçekte (phpMyAdmin veya benzeri bir şey denemek) şeyler dönüyor emin olun

  • Bu gibi işleme deneyin:

.

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