2013-05-26 3 views
0

В принципе у меня есть массив «значки», в котором содержится список идентификаторов значков, которые пользователь приобрел (это было сделано в предыдущем запросе), мне нужно запустить другой запрос для каждого идентификатора, чтобы выбрать имя, описание и т. д. значка.Выполнение одного и того же запроса mysqli с разными параметрами каждый раз

$level = array("#FFFFFF", "#76EE00", "#00FFFF", "#00FFFF", "#FF77FF"); 
     for ($i = 0; $i < count($badge); $i++) { 
     if($stmt = $mysqli->prepare("SELECT badges.name, badges.description, badges.value FROM badges INNER JOIN user_badges ON user_badges.id_badge = ? LIMIT 1")){ 
      $stmt->bind_param('s', $badge[$i]); 
      $stmt->execute(); 
      echo $badge[$i] . "test"; 
      $stmt->store_result(); 
      $stmt->bind_result($name,$description,$value); 
      //echo $name; 
      $stmt->fetch(); 
      echo '<div class="badge"><span class="bold" style="color:' . $level[$value] . '">' . $name . '</span></div>'; 
      $stmt->close(); 
     } 
    } 

В этом случае массив жетонов содержит значения 1 и 2, как:

array(2) { [0]=> int(1) [1]=> int(2) } 

И это происходит через петлю для штрафа для каждого значения. Однако кажется, что запрос выполняется дважды для значения 1, а не для значений 1 и 2. * Если это имеет смысл Таким образом, я получаю два выхода значка с идентификатором 1, а не 1 и 2.

Я знаю, что могу использовать foreach и т. Д., Но это не проблема. Мне было интересно, может ли кто-нибудь научить меня тому, почему это происходит? Я чувствую, что это связано с привязкой результатов, но я не знаю почему.

+1

выглядит ваш SQL неправильно. Бесполезный JOIN может привести к вашим результатам. Вы попробовали этот запрос в консоли? –

+0

Ничего себе, извините, я действительно даже не потрудился посмотреть на запрос. Вы правы, я изменил его на: «SELECT badges.name, badges.description, badges.value FROM badges INNER JOIN user_badges ON user_badges.id_badge = badges.id WHERE (badges.id =?) LIMIT 1" и он работает сейчас хорошо. Спасибо! – iyop45

ответ

1

Помимо искаженного SQL, ваш метод запуска подготовленных операторов является довольно неправильным. Вы должны перемещать подготовку снаружи, а затем запускать только привязку и выполнение в цикле.
Это точка подготовлены заявления на самом деле

$stmt = $mysqli->prepare("SELECT badges.name, badges.description, badges.value FROM badges INNER JOIN user_badges ON user_badges.id_badge = badges.id WHERE (badges.id = ?) LIMIT 1"); 
for ($i = 0; $i < count($badge); $i++) { 
    $stmt->bind_param('s', $badge[$i]); 
    $stmt->execute(); 
    echo $badge[$i] . "test"; 
    $stmt->store_result(); 
    $stmt->bind_result($name,$description,$value); 
    //echo $name; 
    $stmt->fetch(); 
    echo '<div class="badge"><span class="bold" style="color:' . $level[$value] . '">' . $name . '</span></div>'; 
} 

Кроме того, похоже, что РЕГИСТРИРУЙТЕСЬ бесполезно здесь, и вы можете запросить только badges таблицу

+0

Я уверен, что вы правы, но для этого возникает множество ошибок для меня? Предупреждение: mysqli_stmt :: store_result(): Не удалось получить mysqli_stmt в etc и т. Д. – iyop45

+0

ах, забыл удалить из цикла –

+0

А, хорошо, спасибо, что сейчас отлично. Еще раз спасибо. – iyop45