1

我正在尝试使用以下 MySQL 查询,但显然有问题。我正在尝试让page.phppage.php?q=返回以下查询:

if (!isset($_GET['q'])) { $where = "WHERE column1 LIKE %"; }
else { $where = "WHERE column1 LIKE ".$_GET['q']; }

$query = "SELECT column1, column2 FROM table '$where' GROUP BY column1";

所以如果没有 GET,那么WHEREMySQL 查询中就没有。我将 GET 设置为某个值,然后有一个WHERE具有该 GET 值的值。

目前我收到以下错误:

您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的 ''WHERE column1LIKE ' GROUP BY column1' 附近使用正确的语法

4

4 回答 4

2

您需要使用某种转义,但这是另一天的练习。如果您只是想让它工作,请删除 where 变量周围的单引号。

$query = "SELECT column1, column2 FROM table $where GROUP BY column1";
于 2012-12-08T01:06:11.007 回答
1

您需要将搜索字符串放在WHERE单引号之间的子句中,如下所示:

$where = "";
// if there the get q is set we add the were clause
if (!isset($_GET['q'])) {
    $where = "WHERE column1 LIKE %";
    // ^ This WHERE clause is useless, since it matches all strings.
    // Omitting this WHERE clause has the same effect.
}
else { $where = "WHERE column1 LIKE ".$_GET['q']; }

$query = "SELECT column1, column2 FROM table ".$where." GROUP BY column1";

请注意,您的脚本极易受到攻击。阅读有关 SQL 注入的信息

于 2012-12-08T01:10:25.003 回答
1

对于使用PDO的通用解决方案,请尝试此代码段(其中 $db 是 PDO 连接对象)。

$params = array();

$sql = 'SELECT column1, column2 FROM table where 1 ';

if (!empty($_GET['q'])) {
    $sql .= " column1 like ?";
    $params[] = '%' . $_GET['q'] . '%';
}

if (!empty($_GET['r'])) {
    $sql .= " column2 like ?";
    $params[] = '%' . $_GET['r'] . '%';
}

$sql .= ' GROUP BY column1 ORDER BY column1';

$query = $db->prepare($sql);
$i = 1;
foreach ($params as $param) {
    $query->bindValue($i, $param);
    $i++;
}
$query->execute();
于 2012-12-08T02:06:16.917 回答
0

我认为你可以简单地这样做:顺便说一句..你不需要另一部分“”类似%“”你可以简单地省略 where 子句,它会产生相同的效果......这是什么的副本你刚刚发布:

$where = "";
//if there the get q is set we add the where clause
if(isset($_GET['q'])) { 
   $where = "WHERE column1 LIKE '".$_GET['q']."'"; 
}

$query = "SELECT column1, column2 FROM table ".$where." GROUP BY column1";
于 2012-12-08T01:08:09.437 回答