为什么我的IF STATEMENT结果会显示,但我的ELSE STATEMENT也会运行?

时间:2011-08-26 18:11:53

标签: php mysql if-statement

我想拔出我的头发试图解决这个问题......

<?php
include('connection.php');

$template = $_GET['templateID'];
$campaign = $_GET['campaignID'];

// Grab everything in the campaign manager
$cm = mysql_query("SELECT * FROM campaign_manager WHERE campaign ='$campaign'") or die(mysql_error());

while($temp = mysql_fetch_array($cm)){
    //Checks if Template is already attached
    if($temp['paragraph'] == $template){
        echo 'Template is already attached - <a href="http://general:8888/templates">Back</a>';
    } else {
        if($temp['paragraph'] == '0' || $temp['paragraph'] == null ){
            mysql_query("UPDATE campaign_manager SET paragraph = '$template' WHERE campaign = '$campaign'") or die(mysql_error());
        }
        else {
            $geo = $temp['geo'];
            $list = $temp['list'];
            mysql_query("INSERT INTO campaign_manager(campaign,paragraph,geo,list) VALUES('$campaign','$template','$geo','$list')");
        }
    }
} 
?>

我的第一个IF正在检查DUP。如果不是,则检查该字段是0还是NULL。如果要检查那么它应该在“活动经理”中添加新记录。虽然目前它显示了第一个IF&amp;的回声。它将重复记录添加到广告系列管理器中。为什么&amp;这是怎么回事?

4 个答案:

答案 0 :(得分:2)

这是一个while循环,是否可能导致问题? 两条记录很容易使其回显和更新。

检查您的代码以查看该网页是否也会刷新。

答案 1 :(得分:1)

没有。这根本不可能。你可能在某个地方有这部分代码而且它导致了2次执行

答案 2 :(得分:0)

让我们尝试一些事情:

首先,你有很多安全漏洞,所以我不建议任何人使用上面的代码,因为潜在的XSS和SQL注入漏洞。您正在从'GET'传递参数并将其直接放入查询值中。

这样做的正确方法是可以搜索到的:

https://www.owasp.org/index.php/Category:OWASP_Top_Ten_Project

通过PDO(首选)或mysql_real_escape的PHP SQLi预防措施可以在php.net手册中找到,通过对MySQL PDO进行简单的谷歌搜索。

... grr php ...

好的下一步,您的分支逻辑有点缺陷。让我们分解它来处理它。

if($temp['paragraph'] == $template){
        echo 'Template is already attached - <a href="templates">Back</a>';
 } elseif ($temp['paragraph'] == '0') {
            mysql_query("UPDATE campain_manager SET paragraph = '$template' WHERE campaign  = $campain'") or die(mysql_error()); 
 }
   elseif ($temp['paragraph'] == null ){
            mysql_query("UPDATE campaign_manager SET paragraph = '$template' WHERE campaign = '$campaign'") or die(mysql_error());
        }
else 
{ $geo = $temp['geo'];
            $list = $temp['list'];
            mysql_query("INSERT INTO campaign_manager(campaign,paragraph,geo,list) VALUES('$campaign','$template','$geo','$list')");
        }
    }
} 
?>

现在我不是交易开发人员,这对许多人来说感觉不正确,我认为你可能会重新考虑你的代码并使其变小。如果可以的话,我也会尝试让它更具功能性。顺便说一句,我没有时间纠正上述所有问题,让我告诉你,我上面的代码也很脆弱。要正确更正它,请将mysql_query替换为mysql_real_escape_string。还要确保您不仅仅是从用户那里获取输入并且:

A)对其进行不正确的消毒, B)输出不正确。

不要信任所有客户端代码,服务器上的验证是可信的。不要提供服务器端代码客户端。

HTH

中号

答案 3 :(得分:0)

哇,所以在周末重新考虑我的代码之后。我想出了这个......

<?php
include('connection.php');

$template = $_GET['templateID'];
$campaign = $_GET['campaignID'];

// Grab everything in the campaign manager
$cm = mysql_query("SELECT * FROM campaign_manager WHERE campaign ='$campaign'") or die(mysql_error());
$match = 0;

while($temp = mysql_fetch_array($cm)){
    if ($temp['paragraph'] == $template){
        echo 'Template is already attached - <a href="http://general:8888/templates">Back</a>';
        $match = 1;
    }
}

$geo = $temp['geo'];
$list = $temp['list'];

if ($match == 0){
    mysql_query("INSERT INTO campaign_manager(campaign,paragraph,geo,list) VALUES('$campaign','$template','$geo','$list')");
    header('Location: http://general:8888/templates/');
}

?>

终于可以了。