php函数执行不正确?

xzabzqsa  于 2021-06-18  发布在  Mysql
关注(0)|答案(4)|浏览(470)

这个问题在这里已经有答案了

使用php的“notice:未定义变量”、“notice:未定义索引”和“notice:未定义偏移量”(28个答案)
两年前关门了。
我正在构建一个小的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)book2.0\bootstrap\topics.php中的未定义索引:tid
警告:mysqli\u num\u rows()期望参数1是mysqli\u result,在c:\xampp\htdocs(a)book 2.0\bootstrap\content\u function.php的第110行中给出布尔值
我很确定我定义了变量tid,因此对此的任何见解都将不胜感激。

8ehkhllq

8ehkhllq1#

您当前的查询:

$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.”=和topic\u id=“..$tid);
最后,研究如何清理查询。
https://www.shift8web.ca/2015/06/securing-your-mysql-queries-from-sql-injection-in-php/

anhgbhbe

anhgbhbe2#

您的错误消息显示$\u get['tid']没有值:
注意:第56行的c:\xampp\htdocs(a)book2.0\bootstrap\topics.php中的未定义索引:tid
脚本的另一个提示:
1) 不要将外部变量直接用于sql查询。在mysqli中,总是使用real_escape_string方法过滤外部sql注入;
2) 将$mysqli声明为全局变量更容易,因此,不需要将其作为参数传递;
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。

dfddblmv

dfddblmv3#

问题出在 $_GET['tid'] 你确定已经定了吗? mysqli_num_rows() 正在返回该错误,因为如果查询失败,它将返回false。
检查 $_GET['tid'] 先有一些可以接受的东西。我总是建议尝试捕获代码或至少确认结果,特别是如果它是来自用户输入!

hiz5n14c

hiz5n14c4#

错误的意思是相反的,但是“未定义索引”的意思是试图查找索引 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 .
为了避免这种情况,您应该始终引用您的参数(这将因为变量插值而起作用):

"SELECT category_id, subcategory_id, topic_id FROM replies 
 WHERE '$cid' = category_id AND '$scid' = subcategory_id AND '$tid' = topic_id"

您仍然会得到错误的结果,但要避免其他级联错误。
但是,在调用函数之前,应该检查是否存在所有必需的参数。同时,您还应该学习如何防止sql注入。

相关问题