如何确保mysqli通过if($ result){}循环?

时间:2018-09-30 06:46:27

标签: php mysqli

我的php页面中有此php代码。我想根据用户对数量的选择来计算门票价格。我最近在数据库中添加了门票价格列。我已经在数据库中将门票价格设置为 DECIMAL(8,2)Not NULL 。在此之前,没有门票价格,它在数据库中的更新良好,并输出到recipt.php。但是现在,在我添加了此新列之后,它似乎没有经过'if'循环,而且我不知道自己在哪里做错了,所以我猜我在 $ result =中是错的。 .. 声明,但我不确定为什么。由于它不会通过'if'循环,因此将输出两个回显(请参见代码注释)和“ failure”语句。

<?php
        if (isset($_POST['submit'])){
            if($_SESSION['logged']==true){
                $username = $_SESSION['login_user'];
                $quantity = $_POST['quantity'];
                $ticketprice = $quantity*1.70;

                $host = "localhost";
                $dbusername = "root";
                $dbpassword = "";
                $dbname = "ktm_member";
                $dbtable = "member selection list";

                $conn = mysqli_connect($host, $dbusername, $dbpassword) or die("cannot connect");
                mysqli_select_db($conn, $dbname) or die("Cannot select db");

                $query="SELECT * FROM `member list` WHERE `Username` = '$_SESSION[login_user]'";
                $result = mysqli_query($conn,$query);
                $count = mysqli_num_rows($result);
                if($count==1){
                    //this two echos works fine
                    echo "ticket price:";
                    echo $ticketprice;
                    $sql = "INSERT INTO `member select ticket`(`username`, `journeyfrom`, `journeyto`, `date`, `time`, `quantity`, `ticketprice`) VALUES ('$username','$_POST[journeyfrom]','$_POST[journeyto]','$_POST[date]','$_POST[time]','$_POST[quantity]'), '$ticketprice')";

                    $result=mysqli_query($conn,$sql);
                    //but it doesnt seem to go through this if loop
                    if($result){
                        echo "<b>Success</b>";
                        header('Location: http://localhost/mysql/receipt.php'); exit;

                    } else {
                        echo "<b>Failure<b>";
                    }
                } 
            }
        }   
    ?>

2 个答案:

答案 0 :(得分:0)

尝试以下查询

  

$ sql =“ INSERT INTO member select ticketusernamejourneyfromjourneytodatetimequantityticketprice)值('$ username','$ _ POST [journeyfrom]','$ _ POST [journeyto]','$ _ POST [date]','$ _ POST [time]','$ _ POST [数量]',$ ticketprice)“;

问题是有一个额外的将其删除,您可以使用了!

还有一件事是查询有问题,并且返回false,您可以通过

在else块中查找错误

回显mysqli_error($ conn);

答案 1 :(得分:0)

除了语法错误

$sql = "INSERT INTO `member select ticket`(`username`, `journeyfrom`, `journeyto`, `date`, `time`, `quantity`, `ticketprice`) VALUES ('$username','$_POST[journeyfrom]','$_POST[journeyto]','$_POST[date]','$_POST[time]','$_POST[quantity]', '$ticketprice')";

您对SQLIjection敞开了大门,我所要做的就是更改此设置:

 $_POST[quantity] = "10', 0) --";

我刚刚免费获得了您的产品(其中10个),原因是:

  $sql = "INSERT INTO `member select ticket`(..., `quantity`, `ticketprice`) VALUES (..., '10', 0) --'100.00')";

--是一个内联注释,并注释掉其余查询,因此实际上,我将数量设置为10,价格设置为0,然后注释掉了查询的其余部分。

让我们进一步分解一下,查询'$_POST[quantity]', '$ticketprice')";的这一部分直接从$_POST数组中注入数据,任何客户端都可以通过进入浏览器的调试模式{{ 1}},然后编辑表单。

当我将其从f12更改为10时,就会发生这种情况。

  • "10', 0) --"替换为$_POST[quantity]
    • 10
  • 公开报价以(..., quantity,ticketprice)VALUES(...,'10,'$ticketprice')结尾
    • '
  • 为下一个输入值(..., quantity,ticketprice)VALUES(...,'10','$ticketprice')添加逗号
    • ,
  • 添加我的新价格(..., quantity,ticketprice)VALUES(...,'10',,'$ticketprice')
    • 0
  • 添加右括号(..., quantity,ticketprice)VALUES(...,'10',0,'$ticketprice')以关闭VALUES
    • )
  • 将SQL语句的其余部分注释掉(..., quantity,ticketprice)VALUES(...,'10',0),'$ticketprice')
    • --
    • 或没有评论(..., quantity,ticketprice)VALUES(...,'10',0) --,'$ticketprice')

我强烈建议您阅读准备好的声明!为了防止对您的网站进行这类攻击。

在大多数情况下,您将永远不知道我如何能够免费获得这些“门票”。服务器日志中可能会有某些内容,但是在这种情况下您会怎么做。如果大多数情况是自动进行的,您甚至还知道我入侵了此表格。也许您会在收据上看到它,但是您会对我说什么?

作为一家企业,这是一个无法被远程考虑的机会。这是完全不能接受的,除了被起诉等法律影响外,它还可能破坏您的声誉。而且,如果您花费任何金钱来建立品牌,那么一切都将烟消云散。用户会问,是否容易破解您的网站,在这样的网站上我的信用卡安全吗?...

http://php.net/manual/en/mysqli.quickstart.prepared-statements.php