我的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>";
}
}
}
}
?>
答案 0 :(得分:0)
尝试以下查询
$ sql =“ INSERT INTO
member select ticket
(username
,journeyfrom
,journeyto
,date
,time
,quantity
,ticketprice
)值('$ 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
)
(..., quantity,ticketprice)VALUES(...,'10',0),'$ticketprice')
--
(..., quantity,ticketprice)VALUES(...,'10',0) --,'$ticketprice')
我强烈建议您阅读准备好的声明!为了防止对您的网站进行这类攻击。
在大多数情况下,您将永远不知道我如何能够免费获得这些“门票”。服务器日志中可能会有某些内容,但是在这种情况下您会怎么做。如果大多数情况是自动进行的,您甚至还知道我入侵了此表格。也许您会在收据上看到它,但是您会对我说什么?
作为一家企业,这是一个无法被远程考虑的机会。这是完全不能接受的,除了被起诉等法律影响外,它还可能破坏您的声誉。而且,如果您花费任何金钱来建立品牌,那么一切都将烟消云散。用户会问,是否容易破解您的网站,在这样的网站上我的信用卡安全吗?...
http://php.net/manual/en/mysqli.quickstart.prepared-statements.php