Цикл не отображает элементы массива

provizorokl

Новичок
Долго Гуглил и попал сюда. Проблема... Есть файл пхп в котором перечень категорий и из него методом ГЕТ передается переменная
PHP:
<?php 
$bada = mysql_connect("localhost","neofrontuser","152634");
mysql_select_db("neofront", $bada);
$result3 = mysql_query("SELECT * FROM categorias ORDER BY title", $bada);
$mifila3 = mysql_fetch_array($result3);
		 do 
		{printf ("| <a class='catlink' href='ex2.php?bid=%s'>%s</a> |",$mifila3["bid"],$mifila3["title"]);}
		while ($mifila3 = mysql_fetch_array($result3));
?>
(она же создается запросом к таблице базы даных) - (первая таблица на рисунке)

, которую проверяет на наличие запросом к другой таблице (вторая таблица на рисунке) Базы даных другой файл.
PHP:
<?php 
$bada = mysql_connect("localhost","neofrontuser","152634");
mysql_select_db("neofront", $bada);
if (!empty($_GET['bid'])) $bid   = $_GET['bid'];
 $result2 = mysql_query("SELECT id, cat, title, m_key, text, imagen_median FROM articulos WHERE MATCH(cat) AGAINST('$bid') ORDER BY fecha LIMIT 10", $bada);
 $mifila2 = mysql_fetch_array($result2);
	    do
		{printf("%s", $mifila2["title"]);}
		while ($mifila2 = mysql_fetch_array($result2))

?>
И теперь проблема. Как результат выводит даные в нужном мне списке, НО.. если вторая таблица содержит больше, чем 2 результата для вывода, то цикл ничего не выводит. Тоесть, выводятся статьи со значением переменной (bbb2, bbb3, bbb6). bbb1 - НЕ ВЫВОДИТ НИЧЕГО. Если, же я из второй таблицы удалю bbb1 и оставлю только в двух строках, то это значения переменной (соответствующие ей статьи) выводятся без проблем. Прошу извинить и помочь.
 

Вложения

antson

Новичок
Партнер клуба
строка 5. возможна sql инъекция
строка 6. при отсутствии результатов поиска - ошибка
строка 7. Начало цикла с постусловием
строка 8 ошибка в случае см строка 5

прочитать про mysql_escape_string , переписать через цикл while(){}

прочитать http://phpfaq.ru/debug - "Ничего не работает, что делать"
 

provizorokl

Новичок
Я пока на локалке, так что за инъекции пока не волнуюсь.
При отсутствии результатов поиска вообще ничего... Это обрезаный код, та самая часть, что не работает. Поэтому, здесь отсутствуют, какие-либо части, что отвлекают, жаждущего мне помочь.
Если начало цикла с постусловием, то что-то выводит все-таки. Цикл while(){}, я пробовал, еще до обращения на форум. Идентично.
mysql_escape_string - не понял ее применения в моем случае... Хотя еще почитаю.
Обратите внимание, что скрипт при определенных условиях, что-то, да выводит.
И еще эксперименты..
1.При выводе (точнее не выводе) ошибочного варианта в html-коде ламается все, что идет ниже скрипта на странице (осутствует футер и т. д.)
2. Я пробовал менять поле bid с типа varchar на тип text, потом первый скрипт переделывал на форму поиска и передавал переменную методом ПОСТ. Тоже самое в результате. Тоесть, если я попробую создать поиск на страничке, он не будет работать.
 

provizorokl

Новичок
Я с php только год, но впервые обращаюсь на форумы. До теперь сам искал все решения проблем, нежалея времени. Но здесь не могу определить направление в котором надо искать решение проблемы. Заранее спасибо..
 

provizorokl

Новичок
Вроде разобрался где применить mysql_escape_string(), но безрезультатно...
 

sobachnik

Новичок
Если всё ломается - попробуй так
printf("%s", htmlspecialchars($mifila2["title"]));
 

provizorokl

Новичок
Если всё ломается - попробуй так
printf("%s", htmlspecialchars($mifila2["title"]));
Увы.. нет. Я даже попробовал только id статей выводить, чтобы исключить какое-либо влияние ненужных символов. Как и раньше, если до двух записей, то выводит все красиво и как мне нужно. При более, чем двух остается только хедер. В html последнее, что остается, это пустой блок DIV в котором должны быть результаты роботы цикла.
 

provizorokl

Новичок
Я все делаю на локалке. Не знаю как сделать правильно. Создал .htaccess с вписаным php_flag display_errors on

А также прописал в файлах
PHP:
<?
  ini_set('display_errors', 1);
  error_reporting(E_ALL);
?>
Не отображает никаких ошибок.
Все как и раньше. Ощущение, что это нормальная работа ПХП.
 

sobachnik

Новичок
Между строчками
PHP:
$result2 = mysql_query("SELECT id, cat, title, m_key, text, imagen_median FROM articulos WHERE MATCH(cat) AGAINST('$bid') ORDER BY fecha LIMIT 10", $bada);
и
PHP:
$mifila2 = mysql_fetch_array($result2);
попробуй добавить какой-нить вывод, например просто
PHP:
echo 'It works!';
И посмотри, выведется ли это. Если нет - поищи сообщения об ошибках в исходном коде (html).
Попробуй добавить trim(), т.е.
PHP:
<?php
// ...
mysql_select_db("neofront", $bada);
if(get_magic_quotes_gpc()) $_GET['bid'] = stripslashes($_GET['bid']);
$bid = mysql_escape_string(trim($_GET['bid']));
$result2 = mysql_query("SELECT id, cat, title, ...");
// ...
?>
Во всех mysql_query() добавь в конец or exit(mysql_error());, т.е. чтобы было примерно так:
PHP:
<?php
// ...
$result = mysql_query("SQL - запрос", $bada) or exit(mysql_error($bada));
// ...
?>
Убедись в том, что в б.д. присутствуют все столбцы, указанные в запросе...
 

provizorokl

Новичок
Вот опять 2 файла. Они претерпели разные "косметические" изменения, но суть не изменилась
PHP:
<?php 
define("HOST","localhost");
define("USER","neofrontuser");
define("PASS","152634");
define("DB","neofront");

$bada = mysql_connect(HOST,USER,PASS) or die(mysql_error());
mysql_select_db(DB, $bada);


$sql = "SELECT * FROM `categorias` ORDER BY `title`";
$res = 	mysql_query ($sql) or die(mysql_error()."<br/>".$sql);	

while ($row = mysql_fetch_assoc($res))
{printf("<a href='ex2.php?bid=%s'>%s</a>",$row['bid'], $row['title']);}		
?>
и
PHP:
<?php 
define("HOST","localhost");
define("USER","neofrontuser");
define("PASS","152634");
define("DB","neofront");

$bada = mysql_connect(HOST,USER,PASS) or die(mysql_error());
mysql_select_db(DB, $bada);

if (!empty($_GET['bid'])) $bid   = $_GET['bid'];

$sql = "SELECT * FROM `articulos` WHERE MATCH(cat) AGAINST('". mysql_escape_string($bid) ."')";
echo 'It works!';
$res = 	mysql_query ($sql) or exit(mysql_error($bada)."<br/>".$sql);
echo 'It works2!';
while ($row = mysql_fetch_assoc($res))
echo 'It works3!';
{echo $row['imagen_median'];}
echo 'It works!4';
?>
Обратите внимание, что
PHP:
echo 'It works!';
я прописал почти после каждой строчки. Таблицы в базе, те что и раньше.(см. выше). Если я запрошу и з таблицы по этим скриптам строчки, где "cat" приравнивается к "bbb2" или "bbb3", то выводит все варианты
PHP:
echo 'It works!';
причем
PHP:
echo 'It works3!';
2 раза. Тоесть срабатывает цикл, который вытягивает 2 строчки из таблицы с существующими даными. Если запрошу "bbb6", то все works-ы выведет по одному разу. При запросе "bbb5" выводит все, кроме works3. Это нормально, потому, что условие цыкла оказывается пустым. А вот при запросе "bbb1" ,то же что и "bbb5". Ощущение, что не выполняется условие цикла. Но..., если я очищу вторую таблицу от "bbb1" оставив только в двух строчках или меньше, то цикл срабатывает. Неважно с каких строх я их удалю, главное, чтобы их общее количество не превышало 2. В исходном коде ничего нету, если обратили внимание, я упростил максимально скрипты до тестового варианта. Все функции,удаляющие лишние(ненужные) символы, пробелы испробовал. Ничего. Тоже самое. Я задумался уже, нету ли настроек каких, незнаю, а Денвере там, что предотвращают выполнение цыкла, если число "оборотов" должно превышать определенное число. На сайте все другие циклы работают, по этому же принципу. Вся разница, что там переменные объявлены внутри того же файла, а здесь приходят с другого...
 

sobachnik

Новичок
Используй LIKE вместо MATCH ... AGAINST. :) Ну либо юзай MATCH ... AGAINST ... IN BOOLEAN MODE
Там bbb1 тупо набирает 50%-й порог и MySQL считает его словом-мусором с нулевой ценностью и его нет в выборке.
 

provizorokl

Новичок
Огромное спасибо. C LIKE все заработало. А проблема, что не выводило футер, у меня в основных скриптах в конструкции if-else при невыполнении условия стояло exit(). Тут мой косяк, извиняюсь. Спасибо и тему можна считать закрытой.
 
Сверху