2016-11-15 72 views
-1

即时通讯尝试将过滤器应用到基于网页网址的查询中。但它似乎并没有从我的数据库中返回正确的数据。

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 = &pound;<?php echo $totalChampagne; ?></p> 
<p>Spirts Total = &pound;<?php echo $totalSpirts; ?></p> 
<p>Wine Total = &pound;<?php echo $totalWine; ?></p> 
<p>Total = &pound;<?php echo $total; ?></p> 

我已经在每个IF中添加了echo,以确保我的值已被接收,并且我可以根据url在正确的位置看到回显。

的URL看起来像 - revenue_feed.php从= 20160101 &为= 20161115,这是不带连字符时,我测试了它手动输入日期连字符打破它作为格式化的日期吗?

我希望这是一个简单的修复,但我似乎无法解决。所有的帮助非常感谢。

+0

这种方法使得你的应用程序_wide open_ SQL注入攻击。请了解将“准备好的语句”与“参数绑定”结合使用的安全优势。这个细节是必须的,它不是“很高兴有”。 – arkascha

+0

@arkascha谢谢,但我知道它将是封闭的网站,所以sqi注射不应该是一个问题,但是如果需要我会逃避字符串? –

+1

不,不要手动逃生。正如所写:使用“准备好的语句”和“参数绑定”相结合。并且_please_不要推迟,因为“现在不需要”。你一定不会浏览你的所有应用程序,并在以后再做一切改变,一旦一切正常。现在做,这不需要更长的时间。 – arkascha

回答

1

对于要解释的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); 
+1

“BETWEEN”?“”你100%确定吗? –

+0

*“不像您对SQL查询所做的单引号)”*。这很讽刺,但是你发布了“BETWEEN”吗?“”你真的相信这会起作用,是吧?我真诚地怀疑它,除非这是我不知道的某种“专家预备声明”。 –

+0

我的意思是整个字符串需要用双引号,所以''这是$ myvar''的工作。但是,这并不重要,因为他应该使用准备好的语句,所以我将字符串留在单引号内。还有,我错过了问号周围的双引号。 –