добавление значений в массив с помощью цикла while - PullRequest
0 голосов
/ 01 апреля 2012

Итак, я пытаюсь создать живой поиск друзей.Для этого мне нужен массив имен для AJAX для поиска.

Вот мой цикл while.

if($_REQUEST['D'] == 'viewfriends') {
    $FREINDS = array();
    $FRIENDS_QUERY = "SELECT * FROM `FRIENDS` WHERE `USER` = '{$Modules['User']->Username}' AND `STATUS` = 'accepted' ORDER BY `ID` Limit 10 ;";
    $FRIENDS_RESULT = mysql_query($FRIENDS_QUERY);
    if(mysql_num_rows($FRIENDS_RESULT) > 0) {
        while($FRIENDS_ROW = mysql_fetch_assoc($FRIENDS_RESULT)) {
            $sql = "SELECT * FROM `USERS` WHERE `USERNAME` = '{$FRIENDS_ROW['FRIEND']}' ;";
            $REQUEST_ROW = mysql_fetch_assoc(mysql_query($sql));
            $FRIENDS = $REQUEST_ROW['USERNAME'];
        }
    echo json_encode($FRIENDS);
    } else {
        echo'<div class="update status">Sorry, You have no friends at this time. sadface.</div>';   
    }
}

Я поместил туда echo $FRIENDS в качестве теста, прямо сейчасничего не отображаетГде я сумасшедший?

Ответы [ 4 ]

2 голосов
/ 01 апреля 2012

Вы не можете отобразить массив. Вы можете использовать либо print_r($friends) для отображения всей строки полей, запрашиваемых в запросе (вы запрашиваете *) или вы можете повторить $friends['name'] (в зависимости от того, как вы объявили имя в вашей базе данных)

1 голос
/ 01 апреля 2012

PHP не будет отображать массив.Если вы делаете эхо массива, он выводит «Массив».Кроме того, ваш javascript не будет знать, что делать с массивом PHP, если он будет проходить таким образом.

Попробуйте:

echo(json_encode($FRIENDS));

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

У вас есть пара проблем, которые делают ваш код менее безопасным или менее эффективным.Наиболее очевидная неэффективность заключается в том, что вы выполняете вызов базы данных внутри цикла while, поэтому, если у кого-то есть 10 друзей, это означает, что вы выполнили 11 запросов к базе данных, когда вам, возможно, понадобился только один или два.Вот два запроса:

SELECT * FROM `FRIENDS` 
WHERE `USER` = '{$Modules['User']->Username}' 
AND `STATUS` = 'accepted' ORDER BY `ID` Limit 10

SELECT * FROM `USERS` WHERE `USERNAME` = '{$FRIENDS_ROW['FRIEND']}'

Итак, прежде чем мы определим, можно ли объединить эти два, первым большим красным флагом будет SELECT *.Я использую это все время, но это выгонит вас из лучших баров базы данных.В вашем случае это действительно не нужно.Из второго запроса мы знаем, что единственное, что вы используете в первом запросе, это $FRIENDS_ROW['FRIEND'] для сопоставления с USERNAME.Таким образом, первый запрос может стать следующим:

SELECT FRIEND FROM `FRIENDS` 
WHERE `USER` = '{$Modules['User']->Username}' 
AND `STATUS` = 'accepted' ORDER BY `ID` Limit 10

У вас также есть SELECT * во втором запросе, и мы можем сказать, что (на данный момент) единственное, что вы используете, это USERNAME,таким образом, оно может стать:

SELECT USERNAME FROM `USERS` WHERE `USERNAME` = '{$FRIENDS_ROW['FRIEND']}'

Наконец, из второго запроса мы видим, что имя FRIEND и USERNAME идентичны;в противном случае зачем запрашивать имена пользователей, где имя пользователя совпадает с именем друга.Если это так, мы можем полностью отбросить ваш второй запрос, поскольку мы уже знаем имена пользователей из первого запроса.

Причина, по которой он неэффективен и небезопасен, заключается в том, что вы используете функции OG mysql, которыенеуклюжий и не предлагайте вариант готовых заявлений.Подготовленные операторы позволяют (помимо прочего) помещать переменные в ваш запрос таким образом, чтобы при вызове запроса части, которые являются переменными, были известны и, следовательно, могли быть очищены, что позволяет избежать ужасов инъекций mysql, о которых все упоминали.

Я не буду утомлять вас воспроизведением, но вот как может выглядеть ваш код, если вы используете более новую библиотеку mysqli с подготовленным оператором:

if($_REQUEST['D'] == 'viewfriends') {

    $friends = array();

    $friend_lookup = $mysqli->prepare("SELECT FRIEND FROM FRIENDS WHERE 
                                               USER = ? AND STATUS = 'accepted' 
                                               ORDER BY FRIEND");

    $friend_lookup -> bind_param('s', $userName);
    $userName = $Modules['User']->Username;

    $friend_lookup -> execute();
    $friend_lookup -> bind_result($friend);

    while($friend_lookup -> fetch()) {
        $friends[] = $friend;
    }

    if($friends) {
        echo json_encode($friends);
    } else {
        echo "Sorry, no friends. Boo.";
    }
}
1 голос
/ 01 апреля 2012

попробуйте это:

if($_REQUEST['D'] == 'viewfriends') {
    $FRIENDS = array();
    $USERNAME = $Modules['User']->Username;
    $SQL_QUERY = "SELECT F.*, U.* FROM FRIENDS AS F LEFT JOIN USER AS U ON F.USER = U.USERNAME WHERE F.USERNAME = '{$USERNAME}' AND STATUS = 'accepted' ORDER BY F.ID LIMIT 10";
    $RESULTS = mysql_query($SQL_QUERY);
    if(mysql_num_rows($RESULTS) > 0) {
        while($ROW = mysql_fetch_assoc($RESULTS)) {           
            $FRIENDS[] = $ROW['USERNAME'];
        }
        echo json_encode($FRIENDS);
    } else {
        echo'<div class="update status">Sorry, You have no friends at this time. sadface.</div>';   
    }
}

 $FRIENDS[] = $REQUEST_ROW['USERNAME'];

, тогда print_r($FRIENDS); echo выведет array вам нужно зациклить массив или echo json_encode($FRIENDS);, чтобы увидеть что-то

также вы уверены, что USERNAME - это прописные буквы, а не просто username в нижнем и нижнем регистре, а также имя таблицы.

также я думаю, что вы можете использовать предложение JOIN вместоSQL-запросы

1 голос
/ 01 апреля 2012

У вас есть синтаксическая ошибка:

$FREINDS = array(); должно быть $FRIENDS = array();.

А также:

$FRIENDS = $REQUEST_ROW['USERNAME'] должно быть $FRIENDS[] = $REQUEST_ROW['USERNAME']

А

echo $FRIENDS; должно быть echo json_encode( $FRIENDS );

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