GROUP BY在concat期间不起作用

时间:2010-11-22 09:21:20

标签: php group-by concatenation firebird

我尝试在我的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);
}

1 个答案:

答案 0 :(得分:1)

SELECT X, Y, Z GROUP BY X毫无意义;您还需要按YZ分组,或在聚合函数中使用它们。 DISTINCT也有效,请参阅postgreSQL group by different from mysql?

您还在构建查询字符串时直接使用用户输入,这是SQL注入的邀请。使用参数化查询。 (逃避用户输入似乎也是一个流行的解决方案,虽然我无法弄清楚为什么。)这假设你没有用转义字符串或使用魔术引号替换$_POST内容,这两者都是不好的做法,但没有像SQL注入漏洞那么严重。

如果您认为SQL查询有问题,首先应该将其打印出来并进行检查。就目前而言,像sSearch这样简单的don't输入可能会破坏您的代码。