我尝试在我的PHP-Firebird中将GROUP作为concat。但似乎行不通。 我的剧本如:
$sGroupBy = " GROUP BY LINE_NAME ";
$sQuery = "SELECT ".$sLimit." LINE_NAME, MODEL_ONLY, VER_ONLY, PROD_NO,
LOT_SIZE, START_SERIAL, SERIAL_NO_LOW, SERIAL_NO_UP, PROD_DATE
FROM DOC_TO".$sWhere.$sGroupBy.$sOrder.";";
我该怎么做才能解决这个问题? 你有一些关于PHP-CONCATENATION的网站或教程,我可以更完整地学习吗? 谢谢你的进步。
$sOrder = " ORDER BY PROD_DATE DESC ";
$sWhere = " WHERE (LINE_NAME LIKE '".$_POST['sSearch']."%' OR
MODEL_ONLY LIKE '%".$_POST['sSearch']."%' OR ".
" VER_ONLY LIKE '%".$_POST['sSearch']."%' OR ".
" LOT_SIZE LIKE '%".$_POST['sSearch']."%' OR ".
" START_SERIAL LIKE '%".$_POST['sSearch']."%' OR ".
" SERIAL_NO_LOW LIKE '%".$_POST['sSearch']."%' OR ".
" SERIAL_NO_UP LIKE '%".$_POST['sSearch']."%' OR ".
" PROD_NO LIKE '%".$_POST['sSearch']."%' OR ".
" PROD_DATE LIKE '%".$_POST['sSearch']."%') ";
$sLimit = "";
if ( isset( $_POST['iDisplayStart'] ) )
{
settype($iDisplayStart,'integer');
$iDisplayStart = $_POST['iDisplayStart'];
$iDisplayLength = $_POST['iDisplayLength'];
$sLimit = sprintf(" FIRST %d SKIP %d ",$iDisplayLength,$iDisplayStart);
}
答案 0 :(得分:1)
SELECT X, Y, Z GROUP BY X
毫无意义;您还需要按Y
和Z
分组,或在聚合函数中使用它们。 DISTINCT
也有效,请参阅postgreSQL group by different from mysql?。
您还在构建查询字符串时直接使用用户输入,这是SQL注入的邀请。使用参数化查询。 (逃避用户输入似乎也是一个流行的解决方案,虽然我无法弄清楚为什么。)这假设你没有用转义字符串或使用魔术引号替换$_POST
内容,这两者都是不好的做法,但没有像SQL注入漏洞那么严重。
如果您认为SQL查询有问题,首先应该将其打印出来并进行检查。就目前而言,像sSearch
这样简单的don't
输入可能会破坏您的代码。