gpt4 book ai didi

PHP 检查一个 ID 是否与事件 ID 关联

转载 作者:行者123 更新时间:2023-11-29 16:19:50 24 4
gpt4 key购买 nike

我正在用 PHP 做一个项目,类似于帮助台(我对编程世界很陌生)。每个员工($zaposlenik) 都可以回答每个问题一次。如果他已经回答了选定的问题,他应该被重定向到 mojaTvrtka.php(他工作场所的主页),并且应该有一个 echo 说“您已经回答了该问题”。我不确定为什么它不起作用。 IF 的 else 部分工作正常。

<?php 
include("baza.php");
include("header.php");

$pid=$_POST['id'];
$zaposlenik=$_SESSION['activeUserId'];
$tekst=$_POST["tekstOdgovora"];
$datum=date('Y-m-d H:i:s');

$connect=connectDB();
$query1="SELECT pitanje_id,odgovor.zaposlenik_id AS odgZap
FROM odgovor
LEFT JOIN zaposlenik
ON odgovor.pitanje_id=zaposlenik.korisnik_id
WHERE odgovor.zaposlenik_id='$activeUserId'";

$result1=queryDB($connect,$query1);

if(mysqli_num_rows($result1) == $zaposlenik))
{
header("Location:mojaTvrtka.php");
echo "Vec ste odgovorili na ovo pitanje!";
}
else
{
$query="INSERT INTO odgovor
(pitanje_id,zaposlenik_id,tekst,datum_vrijeme_odgovora) VALUES ('$pid','$zaposlenik','$tekst','$datum')";

$result=queryDB($connect,$query);

header("Location: detaljiPitanja.php?id=$pid");
}

disconnectDB($connect);
?>

最佳答案

一些事情,

网络是无状态的,这意味着从一个请求到另一个请求都是单独完成的(稍后会详细介绍)

在你的代码中

if(mysqli_num_rows($result1) == $zaposlenik))
{
$message = urlencode("Vec ste odgovorili na ovo pitanje!"); //make sure to url encode it, so it's safe for query args
header("Location:mojaTvrtka.php?flash_message=$message"); //pass message via the url
exit(); //always exit after header, ABSOLUTELY no output is allowed before header
}

现在由于无状态的性质,我们必须使用某种持久存储来传递消息。数据不跨请求传递。这就是 echo 不起作用的部分原因。另一个原因是,即使您回显它,页面也会重定向,因此没有人可以看到它。最简单(也是最丑陋)的方法是将该消息作为 url 的一部分传递。

在 header 重定向后使用 exit 非常重要。因为在它之后做事情可能会导致“奇怪”的事情发生。

然后在定向到的页面上您可以

 $flash_message = isset($_GET['flash_message']) ? "<div class=\"flash_message\" >{$_GET['flash_message']}</div>" : '';

echo $flash_message;

未经测试,但很简单。

其他部分

你有这个:

  if(mysqli_num_rows($result1) == $zaposlenik))

基本上,您在这里所说的是 activeUserId 的值应该与结果数匹配。因此,如果我的 id 是 120292,那么我必须准确地知道此条件返回的数字或行为 false。然后触发else,其中当然有这个$query="INSERT INTO odgovor

实际上,您只想知道它们是否有 1 行。所以

 if(mysqli_num_rows($result1) == 1)//returns exactly 1 rows

或者你可以简单地通过这种方式测试它的真实性

if(mysqli_num_rows($result1)) //returns some number of rows

最后一件事

尽管我看不懂:

$query1="SELECT pitanje_id,odgovor.zaposlenik_id AS odgZap
FROM odgovor
LEFT JOIN zaposlenik
ON odgovor.pitanje_id=zaposlenik.korisnik_id
WHERE odgovor.zaposlenik_id='$activeUserId'";

我可以判断您是否需要匹配用户 ID 和问题 ID,您只有一个 WHERE 条件。因此,您可能需要在其中添加问题 ID 的内容。我假设存在某种形式的关系(我假设是答案表)将其与问题表相关联。例如外键(问题 ID)。所以你只需要添加它,并获取相关问题的 ID(看看我在那里做了什么)。

//Obviously this is just PSUDO code, so replace this with your actual field and value...
WHERE odgovor.zaposlenik_id='$activeUserId' AND question_id='$questionId'";

SQL注入(inject)

此外,odgovor.zaposlenik_id='$activeUserId' 对于 SQL 注入(inject)来说是很重要的,所以请使用准备好的语句。

注入(inject)的例子是这样的:

   $activeUserId = "' OR 1 LIMIT 1 --";

这将使您的查询如下:

   SELECT pitanje_id,odgovor.zaposlenik_id AS odgZap
FROM odgovor
LEFT JOIN zaposlenik
ON odgovor.pitanje_id=zaposlenik.korisnik_id
WHERE odgovor.zaposlenik_id='' OR 1 LIMIT 1 --'

-- 是 SQL 中注释的开始,因此之后不会运行。其作用是选择第一行(OR 1 始终为真)并仅返回该行。

在这种情况下,它非常平凡,因为它就像他们回答了问题一样,但重点是我能够对您的数据库执行我想要的任何 SQL 命令。假设用户输入找到了进入 $activeUserId 的方式,即使它没有进入,值得冒这个风险吗?

准备好的语句允许您像这样执行 SQL;

    WHERE odgovor.zaposlenik_id=? AND question_id=?

当你准备好它时,数据库会解析 SQL,并表示没问题。然后,当数据库知道不要将它们设为 SQL 时,这些值就会被添加并执行,从而使这些攻击变得不可能(如果做得正确的话)。

我发现展示一个例子有助于说明这是多么糟糕。也就是说,我不打算编写有关如何正确准备查询的教程,因为网络上有很多教程。

干杯!

关于PHP 检查一个 ID 是否与事件 ID 关联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54580187/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com