Перейти к содержимому


Выбрать шаблон и создать сайт

Некорректный вывод на экран из цикла foreach

#1 Kuchuluk

Kuchuluk
  • Пользователь
  • 315 сообщений
  • Репутация: 5
0

Отправлено 09 Март 2013 - 18:19

подключаю к странице метод таким образом
<select size="2" name="city">
    <option disabled>Выберите город</option>
    <?php echo $base->showSelect("kz_city","*","id>0"); ?>
    </select>
сам метод showSelect выглядит так
public function showSelect($tb_name,$field,$where) //функция когда нужно выбрать из базы занести в тэг select
{
  $data = $this->selWithout($tb_name,$field,$where);
  foreach($data as $d)
  {
   $text = "<option value=".$text.$d['id'].">".$text.$d['city_name']."</option>";
  }
  return $text;
}
метод selWithout, который используется в предыдущем методе такой
public function selWithout($tb_name,$field,$where) // ф-ция выборки из базы когда нужно вручную указывать параметр поиска
{
  if (isset($where))
  {
   $query = "SELECT ".$field." FROM ".$tb_name." WHERE ".$where;
   $result = mysql_query($query) or die("".mysql_error());
   for($data=array(); $row = mysql_fetch_assoc($result); $data[]=$row);
   return $data;
  }
  else
  {
   $query = "SELECT ".$field." FROM ".$tb_name;
   $result = mysql_query($query) or die("".mysql_error());
   for($data=array(); $row = mysql_fetch_assoc($result); $data[]=$row);
   return $data;
  }
}
когда загружаю страницу, она зависает вообще, около минуты грузится и этот список городов выводится с ошибками. метод selWithout рабочий, я его уже использовал в другом месте. Но не могу понять где ошибка.

 

 

  • 0

#2 matroskin8

matroskin8
  • Пользователь PRO
  • 767 сообщений
  • Репутация: 143

Отправлено 09 Март 2013 - 18:36

А что это за цикл такой странный? :)
for($data=array(); $row = mysql_fetch_assoc($result); $data[]=$row);
Некорректная инициализация счетчика, некорректное условие выхода из цикла, некорректное увеличение некорректного счетчика, насколько я понимаю... быть может, ошибаюсь...

Как-то так, наверное, должно быть:
$data=array(); // объявляем массив
for($i = 0; $i < mysql_num_rows($result); $i++){
	 $row = mysql_fetch_assoc($result);
	 $data[]=$row;
}

Или еще проще так:
$data=array(); // объявляем массив
while($row = mysql_fetch_assoc($result)){
	 $data[]=$row;
}

P.S. Проверил. Ваш вариант с заполнением массива в цикле, в принципе, может работать... но использовать его не советую, поскольку второе выражения ведь может вернуть и FALSE - тогда цикл попросту остановится, не пройдясь по всем значениям... пример:
$arr = array(1, 2, 0, 3);
for($data = array(); $row = current($arr); next($arr), $data[] = $row);
print_r($data);

  • 0


#3 Kuchuluk

Kuchuluk
    Topic Starter
  • Пользователь
  • 315 сообщений
  • Репутация: 5

Отправлено 09 Март 2013 - 19:25

Как-то так, наверное, должно быть:

$data=array(); // объявляем массив
for($i = 0; $i < mysql_num_rows($result); $i++){
	 $row = mysql_fetch_assoc($result);
	 $data[]=$row;
}

переделал таким образом, но ничего не изменилось, ошибка в первом методе где-то. Потому что тот метод я до этого использовал, он работал.
  • 0

#4 matroskin8

matroskin8
  • Пользователь PRO
  • 767 сообщений
  • Репутация: 143

Отправлено 09 Март 2013 - 19:44

Ну так может стоит привести текст ошибки, чтобы не гадать что там и как? Да и не помешало бы выложить что именно выводится, поскольку вывод формируется несколько странно:
$text = "<option value=".$text.$d['id'].">".$text.$d['city_name']."</option>";
На первой итерации в переменной $text ничего нет, поэтому в значении option к ID и названию города конкатенируется пустое значение. А на второй итерации туда получается должен конкатенироваться первый option...
может, так правильнее?:
$text .= "<option value='{$d['id']}'>{$d['city_name']}</option>";

  • 0


#5 admin

admin
  • Пользователь PRO
  • 5 272 сообщений
  • Репутация: 54

Отправлено 09 Март 2013 - 20:02

matroskin8, сорри за оффтоп, а что это значит?
{$d['id']}

  • 0

Сколько лет прошло, а ссылки всё ещё лучше покупать тут



#6 Kuchuluk

Kuchuluk
    Topic Starter
  • Пользователь
  • 315 сообщений
  • Репутация: 5

Отправлено 09 Март 2013 - 20:22

matroskin8, спасибо большое! теперь правильно выводится список городов. а до этого я даже исходный код не мог посмотреть, браузер зависал.

matroskin8, сорри за оффтоп, а что это значит?

{$d['id']}

ну элемент массива там же получается из базы данных в первом методе. в цикле foreach он заносится в атрибут value тега option. получается каждому названию города соответствует свой id.
  • 0

#7 matroskin8

matroskin8
  • Пользователь PRO
  • 767 сообщений
  • Репутация: 143

Отправлено 09 Март 2013 - 20:27

matroskin8, сорри за оффтоп, а что это значит?

{$d['id']}

Это для того, чтобы явно выделить имя переменной. В данном конкретном случае как раз для того, чтобы не разрывать строку и не конкатенировать затем переменную, т.е. для того, чтобы код стал читабельнее. Фактически, вот эти две записи равны:
$str = "строка1";
$var = "строка2 ".$str; // на выходе - строка1 строка2
// и
$var = "строка1 {$str}"; // на выходе - строка1 строка2

В приведенном мной примере операторные (фигурные) скобки, в общем-то, не обязательны... Но, допустим, у нас есть переменная $fruit, со значением orange. Мы хотим вывести строку 10 oranges. Соответственно, к значению переменной нужно пристыковать букву s (fruits).
В таком случае:
$fruit = "orange";
echo "10 $fruits"; // 10
будет выведено только число 10, поскольку интерпретатор будет безуспешно искать переменную $fruits. Есть 2 выхода - либо разорвать строку:
$fruit = "orange";
echo "10 " .$fruit. "s"; // 10 oranges
либо явно отделить имя переменной, поместив ее в операторные скобки:
$fruit = "orange";
echo "10 {$fruit}s"; // 10 oranges

matroskin8, спасибо большое! теперь правильно выводится список городов. а до этого я даже исходный код не мог посмотреть, браузер зависал.

Пожалуйста)
  • 1


#8 admin

admin
  • Пользователь PRO
  • 5 272 сообщений
  • Репутация: 54

Отправлено 09 Март 2013 - 20:40

Спасибо, не знал)
Я всегда так делал:


echo "10 " .$fruit. "s";

  • 0

Сколько лет прошло, а ссылки всё ещё лучше покупать тут



#9 matroskin8

matroskin8
  • Пользователь PRO
  • 767 сообщений
  • Репутация: 143

Отправлено 09 Март 2013 - 20:41

Спасибо, не знал)

Пожалуйста :)
  • 0


robot

robot
  • Пользователь PRO
  • 2 652 сообщений
  • Репутация: 85


Оформление форума – IPBSkins.ru