Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 基于url($\u GET[])查询数据库,未按预期工作_Php_Mysql_Sql_Database - Fatal编程技术网

Php 基于url($\u GET[])查询数据库,未按预期工作

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

我正在尝试根据页面URL对我的查询应用过滤器。但是,它似乎没有从我的数据库返回正确的数据

    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($\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语句中。这是两种完全不同的动物。