我已经尽力去搜索这个问题,我想也许我只是在做我不理解的错误?我有一个小的PHP页面,该页面从数据库为我生成一些JSON,以供另一个系统使用。
它非常有效,直到我尝试在带有%通配符的SQL语句中使用LIKE为止。相同的查询可以在phpMyAdmin中完美测试。我有点困惑。
我的数据看起来像这样。
商店,地区,芒果,销售,更多数据。
我正在尝试按地区过滤。地区目前有四个值。我们称它们为“我的商店”,“清仓商店”,“专营店”和“特价”
我希望最终能够做一个像data.php?ShopType = shops这样的URL。这将调出我的查询并过滤该区域中所有带有“商店”的区域
我以为很容易。我构造了一个快速测试查询。
SELECT * FROM `RetailSalesData` WHERE `Date` = '01/07/2019' AND `Region` LIKE '%shop%'
这在phpmyadmin中可以正常工作,但是当我在测试服务器上使用它时,它抛出了500。
我使用$ _GET来获取用于过滤查询的值,因此我删除并注释掉了它,并尝试了直接查询,以防万一我错了,但仍然没有运气。
如果我做类似的事情
"SELECT * FROM `RetailSalesData` WHERE `Date` = '01/07/2019' AND `Region` LIKE 'My shop'"
然后它起作用。但是那样的话,我可能也不会使用LIKE,因为我没有使用%通配符,所以我没有得到想要的所有结果。看来我无法在PHP的查询中使用“%”,而且我也不明白为什么。
<?php
//setting header to json
header('Content-Type: application/json');
$servername = "server";
$username = "User";
$password = "password";
$dbname = "mangoes";
// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
//get the data range and type
//$ShopType = $_GET["ShopType"];
//query to get data from the table
$query = sprintf("SELECT * FROM `RetailSalesData` WHERE `Date` = '01/07/2019' AND 'Region' LIKE '%shop%'");
//execute query
$result = $conn->query($query);
//loop through the returned data
$data = array();
foreach ($result as $row) {
$data[] = $row;
}
//free memory associated with result
$result->close();
//close connection
$conn->close();
//now print the data
print json_encode($data);
?>
从上面的代码中,我期望我的商店列表以及针对“区域”中商店的相应数据被过滤掉的区域值中包含“商店”。如果我的SQL查询使用LIKE包含“%”通配符,我将得到一个500错误页面。
答案 0 :(得分:4)
在查询中,您使用的是
LIKE ='%shop%'
但是,您正在sprintf函数中传递它,该函数对%s字符具有特殊用途。 %s表示您将为该函数提供一个字符串参数,以供sprintf代替%s,并且由于您未提供该参数,因此会出现500错误。
您可以在以下位置获得有关sprintf的更多信息: https://www.php.net/manual/en/function.sprintf.php
答案 1 :(得分:1)
不要在列名周围使用引号,而对字符串日期使用正确的转换
$query = sprintf("SELECT * FROM `RetailSalesData`
WHERE `Date` = str_to_date('01/07/2019' ,'%d/%m/%Y')
AND Region LIKE concat('%', shop,'%')";
答案 2 :(得分:0)
sprintf出现问题,并且您正在将“ region”作为字符串传递..看起来像是列名
使用此代码。
<?php
//setting header to json
header('Content-Type: application/json');
$servername = "server";
$username = "User";
$password = "password";
$dbname = "mangoes";
// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
//get the data range and type
//$ShopType = $_GET["ShopType"];
//query to get data from the table
$query = "SELECT * FROM `RetailSalesData` WHERE `Date` = '15/07/2019' AND Region LIKE '%shop%'";
//execute query
$result = $conn->query($query);
$data1 = $result->fetch_all();
//loop through the returned data
$data = array();
foreach ($data1 as $row) {
$data[] = $row;
}
//free memory associated with result
$result->close();
//close connection
$conn->close();
//now print the data
print json_encode($data);
?>
您也不会获取数据并遍历结果。.更新了代码以对其进行修复。