我正在建立一个小型PHP论坛,允许用户创建帖子并对其发表评论。我有一个特定的功能,应该显示帖子的回复数,由于某种原因,该功能仅显示零。我也有一个类似的功能,可以统计视图,并且运行良好,因此我不确定问题出在哪里。
以下是回复的功能代码:
function countReplies($cid, $scid, $tid, $mysqli){
$select = mysqli_query($mysqli, "SELECT category_id, subcategory_id, topic_id FROM replies WHERE ".$cid." = category_id AND
".$scid." = subcategory_id AND ".$tid." = topic_id");
return mysqli_num_rows($select);
}
这是我的称呼方式:
<div class = "content">
disptopics($_GET['cid'], $_GET['scid'], $mysqli);
countReplies($_GET['cid'], $_GET['scid'], $_GET['tid'], $mysqli);
?>
</div>
我遇到以下错误:
注意:未定义索引:第56行C:\ xampp \ htdocs(A)Book 2.0 \ Bootstrap \ topics.php中的提示
警告:mysqli_num_rows()期望参数1为mysqli_result,在第110行的C:\ xampp \ htdocs(A)Book 2.0 \ Bootstrap \ content_function.php中给出布尔值
我很确定我定义了变量tid,因此对此有任何见解将不胜感激。
答案 0 :(得分:2)
该错误相反,但是“未定义索引”这一事实意味着正在尝试在数组(可能为tid
,而不是变量$_GET
本身的数组中查找索引$tid
。
这种情况发生时,您会得到一个无效的SQL语句,因为您实际上没有向该条件传递任何内容,从而导致语法错误:
"SELECT category_id, subcategory_id, topic_id FROM replies
WHERE $cid = category_id AND $scid = subcategory_id AND = topic_id"
请注意subcategory_id AND = topic_id
。
为避免这种情况,您应始终引用参数(由于variable interpolation而起作用):
"SELECT category_id, subcategory_id, topic_id FROM replies
WHERE '$cid' = category_id AND '$scid' = subcategory_id AND '$tid' = topic_id"
您仍然会得到错误的结果,但要避免其他级联错误。
但是,您应该在调用函数之前 检查是否所有必需的参数都存在。而且,在使用它时,您还应该Learn how to prevent SQL injection。
答案 1 :(得分:1)
您的错误消息说$ _GET ['tid']没有值:
注意:未定义的索引:tid ,位于C:\ xampp \ htdocs(A)Book 2.0 \ Bootstrap \ topics.php,在第56行
脚本的另一个提示:
1)切勿直接在SQL查询中使用外部变量。在MySQLi,始终使用 real_escape_string 方法来过滤外部SQL注入;
2)将$ mysqli声明为 global 变量更容易,因此,您无需将其作为参数传递;
3)您可以使用 COUNT(*) MySQL方法对条目进行计数,并避免大量数据传输和处理。
您可以将代码重写为:
function countReplies ( $cid, $scid, $tid)
{
global $mysqli;
if ( ! $select = $mysqli->query ( "SELECT COUNT(*) AS `Count` FROM `replies` WHERE `category_id` = '" . $mysqli->real_escape_string ( $cid) . "' AND `subcategory_id` = '" . $mysqli->real_escape_string ( $scid) . "' AND `topic_id` = '" . $mysqli->real_escape_string ( $tid) . "'"))
{
return false;
}
return $select->fetch_assoc ()["Count"];
}
此代码是安全的,如果有任何错误或找到的答复数量,则将返回 false 。
答案 2 :(得分:1)
您当前的查询:
$select = mysqli_query($mysqli, "SELECT category_id, subcategory_id, topic_id FROM replies WHERE ".$cid." = category_id AND
".$scid." = subcategory_id AND ".$tid." = topic_id");
应该是:
$select = mysqli_query($mysqli, "SELECT category_id, subcategory_id, topic_id FROM
replies WHERE category_id = ".$cid." AND subcategory_id =
“。$ scid。” = AND topic_id =“。$ tid);
最后,请考虑对您的查询进行清理。
https://www.shift8web.ca/2015/06/securing-your-mysql-queries-from-sql-injection-in-php/
答案 3 :(得分:0)
问题出在$_GET['tid']
,您确定它已设置吗?
mysqli_num_rows()
返回该错误,因为如果查询失败,则返回false。
首先检查可以接受的$_GET['tid']
。
而且我总是建议尝试捕获代码或至少确认结果,尤其是来自用户输入的结果!