Php 基于url($\u GET[])查询数据库,未按预期工作
我正在尝试根据页面URL对我的查询应用过滤器。但是,它似乎没有从我的数据库返回正确的数据Php 基于url($\u GET[])查询数据库,未按预期工作,php,mysql,sql,database,Php,Mysql,Sql,Database,我正在尝试根据页面URL对我的查询应用过滤器。但是,它似乎没有从我的数据库返回正确的数据 if ( $_GET['from'] == '' && $_GET['to'] == '' ) { $query = 'SELECT * FROM mhs_dashboard_revenue'; echo 'none'; } else if ( $_GET['from'] == '' && $_GET['to'] != '' ) { $quer
if ( $_GET['from'] == '' && $_GET['to'] == '' ) {
$query = 'SELECT * FROM mhs_dashboard_revenue';
echo 'none';
} else if ( $_GET['from'] == '' && $_GET['to'] != '' ) {
$query = 'SELECT * FROM mhs_dashboard_revenue WHERE DateOfData BETWEEN 20150101 AND "$_GET[to]"';
echo 'to';
} else if ( $_GET['from'] != '' && $_GET['to'] == '' ) {
$query = 'SELECT * FROM mhs_dashboard_revenue WHERE DateOfData BETWEEN "$_GET[from]" AND 20900101';
echo 'from';
} else if ( $_GET['from'] != '' && $_GET['to'] != '' ) {
$query = 'SELECT * FROM mhs_dashboard_revenue WHERE DateOfData BETWEEN "$_GET[from]" AND "$_GET[to]"';
echo 'both';
}
$result = mysqli_query($connection, $query);
$totalChampagne = 0;
$totalSpirts = 0;
$totalWine = 0;
$total = 0;
while($row = mysqli_fetch_assoc($result)) { ?>
<?php
$totalChampagne = $totalChampagne + $row['ChampagneValue'];
$totalSpirts = $totalSpirts + $row['SpirtsValue'];
$totalWine = $totalWine + $row['WineValue'];
$total = $totalChampagne + $totalSpirts + $totalWine;
?>
<!--
<p>Id: <?php //echo $row['ID']; ?></p>
<p>Date of: <?php //echo $row['DateOfData']; ?></p>
<p>Champagne: <?php //echo $row['ChampagneValue']; ?></p>
<p>Spirts: <?php //echo $row['SpirtsValue']; ?></p>
<p>Wine: <?php //echo $row['WineValue']; ?></p>
<hr>
-->
<?php } ?>
<p>Champagne Total = £<?php echo $totalChampagne; ?></p>
<p>Spirts Total = £<?php echo $totalSpirts; ?></p>
<p>Wine Total = £<?php echo $totalWine; ?></p>
<p>Total = £<?php echo $total; ?></p>
if($\u GET['from']=''&$\u GET['to']=''){
$query='从mhs_仪表板_收入中选择*;
回声“无”;
}else if($\u GET['from']=''&&$\u GET['to']!=''){
$query='从mhs_dashboard_revenue中选择*,其中DateOfData介于20150101和“$_GET[to]”之间;
呼应“到”;
}else if($_GET['from']!=''&$_GET['to']=''){
$query='从mhs_仪表板中选择*数据,其中DateOfData介于“$_GET[FROM]”和20900101'之间;
回音“来自”;
}如果($_GET['from']!=''&$_GET['to']!=''){
$query='从mhs_仪表板中选择*,其中DateOfData介于“$_GET[FROM]”和“$_GET[to]”之间;
呼应‘两者’;
}
$result=mysqli\u查询($connection,$query);
$totalchamping=0;
$totalSpirts=0;
$totalWine=0;
$total=0;
而($row=mysqli\u fetch\u assoc($result)){?>
香槟酒总额=&英镑
Spirts总计=&英镑
葡萄酒总额=&英镑
总额=&英镑
我在每个IF中添加了echo,以确保接收到我的值,并且可以根据url在正确的位置看到echo
URL看起来像-revenue_feed.php?from=20160101&to=20161115,这是一个没有连字符的日期格式,就像我测试它时手动输入连字符破坏它的日期一样
我希望这是一个简单的解决方案,但我似乎无法解决。非常感谢所有帮助。对于要解释的PHP变量,您需要将它们放在双引号内(而不是像SQL查询那样放在单引号内)。但在任何情况下,您的代码都会接受SQL注入,应该避免使用 相反,您可以使用预先准备好的查询,这将为您提供如下信息:
$sql = 'SELECT * FROM mhs_dashboard_revenue WHERE DateOfData BETWEEN ? AND 20900101';
$stmt = mysqli_prepare($connection, $sql);
mysqli_stmt_bind_param($stmt, "s", $_GET[from]);
mysqli_stmt_execute($stmt);
这种方法使您的应用程序极易受到sql注入攻击。请了解将“准备好的语句”与“参数绑定”结合使用的安全好处。这些细节是必须的,不是“很好拥有”@arkascha谢谢,我知道这将是一个封闭的站点,所以sqi注入不应该成为问题,但是如果需要,我将转义字符串?不,不要手动转义。如前所述:使用“准备好的语句”结合“参数绑定”。请不要推迟,因为“现在不需要”。一旦一切正常,您肯定不会检查所有应用程序并在以后再次更改所有内容。现在就做,不会花费更长的时间。“revenue_feed.php?from=20160101&to=20161115,这是一个没有连字符的日期格式,就像我测试它时手动输入连字符打破它的日期一样。”-然后MySQL认为你在尝试做数学(如负数)。如果您的日期列是
日期
类型,则其保存格式为YYYY-mm-dd
,如果您正在执行from=2016-01-01
操作,则这会告诉我您需要引用值。检查查询中的错误也会告诉您。^您想将其作为答案吗?因为这就是问题所在。BETWEEN”“
你100%确定吗?“不像你在SQL查询中那样引用单引号”。这很讽刺,但是你发布了BETWEEN”“
你真的相信这会奏效吗?我真的很怀疑,除非这是某种“大师准备的声明”我不知道。我的意思是整个字符串需要用双引号引起来,这样像“this is$myvar”
这样的东西才能工作。但这不是重点,因为他应该使用准备好的语句,所以我把字符串放在单引号内。是的,我错过了问号周围的双引号。“this is$myvar”工作
确保它工作正常;在PHP中,而不是在MySQL/prepared语句中。这是两种完全不同的动物。