Php: получить наборы результатов из базы данных через MySQL

Я столкнулся с проблемой при извлечении информации из базы данных, используя 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>";

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

13.10.2009 03:34:38
6 ОТВЕТОВ
РЕШЕНИЕ

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

$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.10.2009 04:35:59

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

0
13.10.2009 03:43:24

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

0
13.10.2009 03:43:46

Я очень смущен использованием вами $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.10.2009 22:55:22
Это решает проблему немного, но теперь мне нужно получить доступ к значениям, только если я знаю, что ключи любят печатать значения, которые я должен ввести echo "Value:". $ зр [1]; echo "Value:". $ зр [2]; но проблема в том, что у меня на самом деле нет только 2 элементов в массиве: sp, скорее, у меня есть 30-40 идентификаторов в нем, и поэтому я не хочу писать от 30 до 40 строк для вывода значений. Могу ли я сделать это с помощью цикла? таким образом, что я получаю вывод как: значение 1 равно 0 значение 2 равно 34 значение 6 равно 67 значение 15 равно 56. , , когда массив sp равен (1 => 0,2 => 34,6 => 67,15 => 56 ...)
Usman 13.10.2009 04:58:55

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

0
13.10.2009 03:45:44

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

$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.10.2009 05:20:29