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.";
}
}