Php: получить наборы результатов из базы данных через MySQL - PullRequest
0 голосов
/ 13 октября 2009

Я столкнулся с проблемой при извлечении информации из базы данных, используя php + mysql, и подумал, что будет хорошо, если кто-нибудь здесь предложит выход.

Код проблемы:

$selectedProtocols=array(1,2);
for($i = 0; $i<2; $i++)
{
  $result = mysql_query("SELECT throughput FROM session where mainProtocol='$selectedProtocols[$i]'");
  while($row = mysql_fetch_array($result))
    {   
      $throughput_temp += $row['throughput'];
    }
  $selectedProtocols[$selectedProtocols[$i]]=$throughput_temp;
}

Ниже приведены соответствующие записи в базе данных:

mainProtocol  name  throughput
1             Skype 34
2             HTTP  43
1             FTP   54

Теперь, следующий LOC дает правильный вывод, т.е. (34 + 54 =) 88

echo "1 has throughput=".$selectedProtocols[$selectedProtocols[0]]."<br>";

Но, следуя LOC, выдает ноль вместо 43

echo "2 has throughput=".$selectedProtocols[$selectedProtocols[1]]."<br>";

Я думаю, что есть некоторая проблема с методом извлечения набора результатов при запросе базы данных. Есть идеи, что я делаю не так?

Ответы [ 6 ]

0 голосов
/ 13 октября 2009

Я не знаю, но мне кажется, я вижу логическую ошибку в вашем коде.

$selectedProtocols=array(1,2);
for($i = 0; $i<2; $i++)
{
$result = mysql_query("SELECT throughput FROM session where mainProtocol='$selectedProtocols[$i]'");
  $throughput_temp=0;
  while($row = mysql_fetch_array($result))
    {   
      $throughput_temp += $row['throughput'];
    }
  $selectedProtocols[$selectedProtocols[$i]]=$throughput_temp; 
/* $selectedProtocols[$selectedProtocols[$i]] is equivalent to $selectedProtocol[1 or 2]. 
Therefore you are escaping the index 0 of your array and automatically starts at 1, in your
 case. So the next iteration gives you index 2 which is already out of bounds for your 
array.*/
    }

Попробуйте этот код:

 $selectedProtocols=array(1,2);
for($i = 0; $i<2; $i++)
{
  $throughput_temp = 0;
 // echo $selectedProtocols[$i];
  $result = mysql_query("SELECT throughput FROM session where mainProtocol='$selectedProtocols[$i]'");
  while($row = mysql_fetch_array($result))
    {   
      //echo $row['throughput'];
      $throughput_temp += $row['throughput'];
    }
  $selectedProtocols[$i]=$throughput_temp;
}
echo "1 has throughput=".$selectedProtocols[0]."<br>";
echo "2 has throughput=".$selectedProtocols[1]."<br>";
0 голосов
/ 13 октября 2009

Вы в стороне от ошибки (хотя это тоже должно исправить), вам будет лучше сделать только один запрос . Я бы переписал это как:

$selectedProtocols = array();
$result = mysql_query("SELECT `throughput`, `mainProtocol` FROM `session` WHERE `mainProtocol` IN (1,2)");

while( $row = mysql_fetch_object($result) ) {
  if ( !isset($selectedProtocols[$row-> mainProtocol]) ) {
    $selectedProtocols[$row->mainProtocol] = $row->throughput;
  } else {
    $selectedProtocols[$row->mainProtocol] += $row->throughput;
  }
}

Надеюсь, что помогает

0 голосов
/ 13 октября 2009

$throughput_temp не повторно инициализируется в верхней части цикла for. Кроме того, ваш код будет более понятным без вложения ненужных массивов.

0 голосов
/ 13 октября 2009

Я очень в замешательстве от использования вами массива $selectedProtocols.

Рассмотрим эту строку:

// sp = selectedProtocols ... too much typing otherwise!

$sp[$sp[1]]

// given that $sp == [1, 2]
// resolve the inner

$sp[1] == 2 // therefore:
$sp[$sp[1]] == $sp[2]

// but there is no $sp[2], hence the error

Я бы изменил это на:

$sp = array(1 => 0, 2 => 0);

foreach (array_keys($sp) as $id) {
    $result = mysql_query("SELECT throughput FROM session where mainProtocol = '$id'");
    while($row = mysql_fetch_array($result)) {   
        $sp[$id] += $row['throughput'];
    }
}

Ответ на комментарий:

когда массив sp равен (1 => 0,2 => 34,6 => 67,15 => 56 ...)

Чтобы перебрать массив, в котором нет последовательных (или даже числовых) ключей, вы можете использовать несколько методов, но самый простой из них - foreach. Существует две формы цикла foreach:

$array = array(1=>0, 2=>34, 6=>67, 15=>56);

// the first form:
foreach ($array as $value) {
    echo $value;    // "0", "34", "67", "56"
}

// the second form:
foreach ($array as $key => $value) {
    echo $key . "," . $value;    // 1,0 2,34 6,67 15,56
}

Итак, вы видите, что можете использовать второй метод, чтобы получить все идентификаторы и значения из массива.

0 голосов
/ 13 октября 2009

Где инициализируется throughput_temp? Он должен быть инициализирован в 0 в начале цикла for.

0 голосов
/ 13 октября 2009

Все выглядит хорошо ... Единственное, что я вижу - вы инициализировали переменную $ throughput_temp ранее? Возможно, вы захотите поместить его до и после $ result. Таким образом, ваши переменные не будут повторно использованы с последнего запуска. Попробуйте отладить цикл, добавив эхо на некоторое время, посчитав, сколько раз он выполняется, пока $ i равен 1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...