2015-08-21 3 views
0

Я создал Javascript, который делает запрос AJAX POST в файл PHP ниже, под названием «listgroupsall.php». Однако я не получаю правильные данные.While loop not concatenating string

Запрос AJAX и PHP-скрипт должны возвращать группы, к которым принадлежит член сайта, и отображать на них информацию о них на странице, на которую можно щелкнуть, чтобы перейти на страницу этой группы.

Вот PHP код:

<?php 

//CONTAINS MYSQL SERVER CONNECTION INFO AND OTHER GOODIES 
require_once $_SERVER['DOCUMENT_ROOT'] . '/filepath/config.php'; 

//VARIABLES PASSED IN FROM THE AJAX REQUEST 
$uid = $_POST['uid']; 
$tid = $_POST['tid']; 
$p = $_POST['page']; 
$filter = $_POST['fieldcontent']; 

//FORM MYSQL QUERY 
$gaq = "SELECT g.gid, g.groupname, g.dispname, g.avpath FROM groups AS g INNER JOIN users_groups AS ug ON g.gid = ug.gid AND ug.uid = " . mysql_real_escape_string($tid); 

//ADD CONSTRAINT BASED ON UID IF IT IS NOT PASSED IN AS 0 
if($uid!="0"){ 
$gaq .= " INNER JOIN users_groups AS ug ON g.gid = ug.gid AND ug.uid = " . mysql_real_escape_string($uid); } 

//ADD CONSTRAINT BASED ON FILTER IF IT IS NOT AN EMPTY STRING 
if($filter!=""){ 
$gaq .= " WHERE g.dispname LIKE '%" . mysql_real_escape_string($filter) . "%'"; } 

//ORDER THE RESULTS BY ASCENDING g.dispname 
$gaq .= " ORDER BY g.dispname ASC"; 
//GET AMOUNT OF PAGES REQUIRED TO DISPLAY ALL ITEMS RETURNED, 
// SUCH THAT 10 ITEMS FIT ON 1 PAGE 
$pnum = ceil(mysql_num_rows(mysql_query($gaq))/10); 
//DISPLAY 10 RESULTS, STARTING ON 'PAGE' PASSED IN TO AJAX REQUEST 
$gaq .= " LIMIT " . ($p*10)-10 . ",10"; 
//EXECUTE FULL MYSQL QUERY 
$gaqr = mysql_query($gaq); 

//APPEND A STRING $galisthtml WITH HTML OF THAT BLOCK 
// WHICH CAN BE WRITTEN STRAIGHT TO THE PAGE 
$galisthtml = ""; 
while($row = mysql_fetch_array($gaqr)){ 
    $gid = $row['gid']; 
    $gname = $row['groupname']; 
    $gdname = $row['dispname']; 
    $gavpath = $row['avpath']; 

    $galisthtml .= "<a href='http://galacticsoftware.net/prop/group.php?groupname=" . $gname . "'><div class=gblock><div class=gblockavcont>"; 
    $galisthtml .= "<img src='/prop/assets/img/avatars/group/" . $gavpath . "' Alt='Group Avatar' height=48px width=48px></div>"; 
    $galisthtml .= "<div class=gblocktextcont><h1>" . $gdname . "</h1>&" . $gname . "</div></div></a>"; 
} 

//RETURN THE PAGE NUMBERS TOTAL 
//AND THE GROUPS LISTING HTML 
//(IN THAT ORDER) 
echo json_encode(array($pnum, $galisthtml)); 

?> 

Когда я звоню запрос AJAX, я первый придав ему значения из

uid = 0 
tid = 23 
p = 1 
fieldcontent = "" 

Когда возвращается запрос AJAX, он отправляет обратно

[1,""] 

Целое число верно, говоря, что все возвращенные группы будут помещены на 1 страницу (всего их 4). Тем не менее, похоже, что конкатенация строк внутри цикла while никогда не выполняется. Если я определяю $ galisthtml с непустой строкой, он успешно возвращается, поэтому я знаю, что верну свои данные правильно.

Цикл while Я использую успешно в другой области моей страницы, когда он перебирает строки вместо конкатенации строки и после выполнения того же запроса MYSQL.

Я исследовал эту проблему и даже видел, что другие конкатенируют строки внутри цикла while, без проблем. Я понятия не имею, в чем проблема.

+1

У вас, вероятно, нет никаких результатов – Jage

+0

Если я наберу тот же самый запрос mysql, который будет генерировать этот код, я получаю 4 результата, точно так, как ожидалось. Однако я верну mysql_num_rows вместо конкатенированной строки прямо сейчас, исключительно для тестовых целей. – StrangeOrange

+0

Узнайте, как использовать 'xdebug' для отладки кода и посмотреть, что происходит. Затем [прекратите использование устаревшего и небезопасного 'mysql_query' и переключитесь на PDO] (http://stackoverflow.com/q/12859942/1233508). – DCoder

ответ

1

Вы должны закрыть выражение в скобках:

$gaq .= " LIMIT " . (($p*10)-10) . ",10"; //<- Note bracket around expression 

Для анализа таких вопросов, вы всегда должны распечатать сгенерированный оператор SQL.