PHP函数无法正确执行?

时间:2018-10-14 00:11:23

标签: php mysql function forum

我正在建立一个小型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,因此对此有任何见解将不胜感激。

4 个答案:

答案 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']。 而且我总是建议尝试捕获代码或至少确认结果,尤其是来自用户输入的结果!