【发布时间】:2020-09-22 17:36:02
【问题描述】:
正如您在下面看到的,我正在获取 idsOfSenders 并执行另一个查询以获取该用户的信息。到目前为止,这工作正常。
但是正如你所看到的,我还有另一个变量$msgDate,我想把它放在每个用户的输出中。我该怎么做?
$recieverId = 33;
$query = "SELECT from_msg, chat_date FROM msg WHERE `to_msg` = '$recieverId' ORDER BY `chat_date` DESC";
$res = mysqli_query($conn, $query);
while($row = mysqli_fetch_array($res)) {
$idsOfSenders[] = $row['from_msg'];
$msgDate[] = $row['chat_date'];
}
$queryb = "SELECT fullname, username FROM `users` WHERE `id` IN('".implode("','",$idsOfSenders)."')";
$resb = mysqli_query($conn, $queryb);
if($resb->num_rows >0){
$json=[];
while(($rowb = $resb->fetch_assoc())) {
$json[] = $rowb;
}
echo json_encode($json);
} else {
echo "0";
}
case 'gmmn':
//ini_set('display_errors', 1);
//ini_set('display_startup_errors', 1);
//error_reporting(E_ALL);
if(isTheseParametersAvailable(array('i'))){
if (!$conn) {
return;
}
//$recieverId = str_replace(" ", "", $_POST["i"]);
$recieverId = 33;
$sqlCheckMsg = "SELECT from_msg, chat_date, fullname, username FROM msgNew LEFT JOIN users_table on users_table.id = msgNew.from_msg WHERE to_msg = ? ORDER BY `chat_date` DESC";
$stmt = $conn->prepare($sqlCheckMsg );
$stmt->bind_param("i",$recieverId);
$stmt->execute();
$stmt->store_result();
$stmt->bind_result($from_msg,$chat_date,$fullname,$username);
if($stmt->num_rows > 0){
$rows=[];
while($stmt->fetch()) {
$rows[] = array('from_msg'=>$from_msg
, 'chat_date'=>$chat_date
, 'fullname'=>$fullname
, 'username'=>$username);
}
} else {
echo "0";
return;
}
echo json_encode($rows);
}
break;
【问题讨论】:
-
警告:使用
mysqli时,您应该使用parameterized queries 和bind_param将任何数据添加到您的查询中。 请勿使用字符串插值或连接来完成此操作,因为您创建了一个严重的SQL injection bug。 切勿将$_POST、$_GET或任何类型的数据直接放入查询中,如果有人试图利用您的错误,这可能是非常有害的。做好,不难修复。 -
@tadman 我只是希望你能花 3 秒时间阅读这篇文章的第一行。
-
你是否知道它不安全并不重要,改变你的代码以使用安全版本是几秒钟的工作,所以如果你足够关心你的代码在 Stackoverflow 上向人们寻求帮助,花几秒钟的时间让你的代码没有巨大的安全漏洞。至于如何获取更多数据:只需在
json_encode之前更新$json并返回它?此外,如果您要返回 JSON,请不要返回0,而是返回{},以便在被使用它的任何东西解析时,内容将始终是正确的对象。 -
为您的草率代码道歉比修复它需要更多的努力和精力。这些东西非常重要要做到正确,所以当你半途而废一些代码然后给出一个蹩脚的道歉时,它不仅对你有不好的影响,而且对整个程序员都有影响。这个“我稍后会修复它”或“它只是测试代码!1!”态度是为什么SQL Injection Hall of Fame 页面上永远不会缺少条目的原因。立即将其扼杀在萌芽状态。
-
这个问题解决了吗?它的状态如何?