【问题标题】:Variable concatenated mysql query string runs fine in phpMyAdmin but not PHP in script [duplicate]变量连接的mysql查询字符串在phpMyAdmin中运行良好,但在脚本中运行不正常[重复]
【发布时间】:2011-04-11 20:43:44
【问题描述】:

2011 年 4 月 14 日更新

还是有问题。我将代码简化为最简单的形式。我使用 IF 函数来检查 isset() 的复选框,它工作正常。如果选中该复选框,它将连接由两部分组成的字符串。很简单。

if (isset($_POST[testType1])) {
   $filterQuery .= "(testType1 = '1'"; 
   }
   $filterQuery .= ") ";
}

当我使用 mysql_fetch_assoc 并在 $rows 中回显信息时,它可以工作。但是当我在谷歌浏览器中查看页面源时,它会说: Invalid query: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1;

如果我回显 $filterQuery,它会正确显示,并且当我将回显的字符串复制到我的代码中时,MySQL 会返回正确的结果:

SELECT * FROM fdatav1 JOIN ddatav1 ON ddatav1.ID = fdatav1.ID WHERE (testType1 = '1')

我也尝试将 $filterQuery 转换为字符串。没有成功。

2011 年 12 月 4 日更新

我还是有问题,不是错字。见以下代码:

$query = "SELECT * FROM fdatav1 JOIN ddatav1 ON ddatav1.ID = fdatav1.ID WHERE ";`
$orTrigger = "";`

function setOrTrigger() {
    global $orTrigger;
    if ($orTrigger=="") {
        $orTrigger="OR ";
    }
}

function getTestFilterQuery($testType) {
   if (!(isset($_POST[test1])) && !(isset($_POST[test2])) && !(isset($_POST[test3]))) {
     $returnString = NULL;
     return $returnString;
   }

}

if (isset($_POST[testType1])) {
   $filterQuery .= $orTrigger ."(testType1 = '1'"; 
   setOrTrigger();
   $addTestFilterQuery = getTestFilterQuery("testType1");
   if ($addTestFilterQuery != NULL) {
    $filterQuery .= "AND " .$addTestFilterQuery;
   }
   $filterQuery .= ") ";
}

$connection = mysql_connect(localhost, $username, $password);

if (!$connection) {
   die('Not connected : ' . mysql_error());

}

$db_selected = mysql_select_db($database, $connection);

if (!$db_selected) {
   die ('Can\'t use db : ' . mysql_error());
}

$result = mysql_query($filterQuery);

if (!$result) {
   die('Invalid query: ' . mysql_error());
}

while ($row = @mysql_fetch_assoc($result)) {
   echo $row['name'];
   echo $row['description'];
}

当我回显 $query 时,我得到:

SELECT * FROM fdatav1 JOIN ddatav1 ON ddatav1.ID = fdatav1.ID WHERE (testType1 = '1')

当我将它直接复制到 mysql_query 中时:

mysql_query("SELECT * FROM fdatav1 JOIN ddatav1 ON ddatav1.ID = fdatav1.ID WHERE (testType1 = '1')");

它工作正常。但是当我传递变量时:

mysql_query($filterQuery);

我在 '' 附近得到一个语法错误。有谁知道如何解决这个问题?

【问题讨论】:

  • 你得到什么错误?也许向我们展示您的代码?
  • 您能否给出一个固定变量的代码示例,例如 $tmp = 'myname' 和选择以及如何将变量插入到查询中
  • 您可能应该发布您的代码。否则,我们就是瞎子。
  • The variable sql statement starts with "SELECT FROM... and ends with " 是的,这很酷。但我们想要一些真正的代码。
  • 这就像在停电中猜测..但我猜答案是“反引号”

标签: php mysql phpmyadmin syntax-error


【解决方案1】:

你真的把双引号放在字符串中吗,比如:

$query = '"SELECT * FROM table WHERE col = value"';
echo $query; //output is exactly: "SELECT * FROM table WHERE col = value"

如果是这样,您需要从字符串中删除"s,mysql_query 或任何采用普通字符串的内容,例如:

$query = "SELECT * FROM table WHERE col = value";
echo $query; //output is exactly: SELECT * FROM table WHERE col = value

以同样的方式,您不会以 ; 在字符串中结束 SQL 查询,例如:$query = "SELECT * FROM table WHERE col = value;";

【讨论】:

  • +1 表示“不要以 ; 结尾”暗示。 mysql_query 不支持多查询
  • @Giacomo:更像是底层驱动程序没有。 mysql_query() 只是直接向前传递查询字符串,如果有无效的语法,一个查询或500个查询,它不在乎。
  • @Marc:我只是从客户端的角度讨论效果,不管实现。感谢您的澄清。
【解决方案2】:

查询的 concat 示例

$query = "select * from tablename ";
$query.= "WHERE id=1";
$query.= " and item_id= 'foo'";

【讨论】:

  • code SELECT * FROM fdatav1 JOIN ddatav1 ON ddatav1.ID = fdatav1.ID WHERE (acc1 = '1')
  • 对这个评论很抱歉,这个网站的新手。 concat 部分很好,就像一个魅力,当我回显 $query 时,我得到:SELECT * FROM fdatav1 JOIN ddatav1 ON ddatav1.ID = fdatav1.ID WHERE (acc1 = '1') 在 phpmyadmin 中工作,但是,把它放在 $result = mysql_query($query) 中,我在 '' 附近得到一个语法错误
  • 试试这个:WHERE (`acc1` = '1')
  • @Stewie:仅当字段/表名称是保留字时才需要反引号。
【解决方案3】:

尝试在这段代码中添加一个 else 块,如下所示。否则 $filterQuery 将永远不会被设置,除非 isset($_POST[testType1])。

if (isset($_POST[testType1])) {
   $filterQuery .= $orTrigger ."(testType1 = '1'"; 
   setOrTrigger();
   $addTestFilterQuery = getTestFilterQuery("testType1");
   if ($addTestFilterQuery != NULL) {
    $filterQuery .= "AND " .$addTestFilterQuery;
   }
   $filterQuery .= ") ";
} else {
   $filterQuery = $query;
}

【讨论】:

    猜你喜欢
    • 2012-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-25
    • 2021-09-06
    相关资源
    最近更新 更多