所以我要做的就是创建一个实时的朋友搜索。要做到这一点,我需要一个AJAX名称数组来搜索。
继承我的循环。
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
放在那里作为测试,现在它没有显示任何内容。我在哪里derp?
答案 0 :(得分:2)
您无法回显数组。您可以使用print_r($friends)
显示查询中请求的整行字段(您请求*)
或者您可以回显$friends['name']
(取决于您在数据库中声明名称的方式)
答案 1 :(得分:1)
您有语法错误:
$FREINDS = array();
应为$FRIENDS = array();
。
还有:
$FRIENDS = $REQUEST_ROW['USERNAME']
应为$FRIENDS[] = $REQUEST_ROW['USERNAME']
和
echo $FRIENDS;
应为echo json_encode( $FRIENDS );
答案 2 :(得分:1)
试试这个:
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请求
答案 3 :(得分:1)
PHP实际上不会回显数组。如果对数组进行回声,则输出“Array”。另外,如果PHP数组以这种方式传递,你的javascript就不知道如何处理它。
尝试:
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.";
}
}