在 SQL 中有效但在 PHP 中无效的查询
Posted
技术标签:
【中文标题】在 SQL 中有效但在 PHP 中无效的查询【英文标题】:Query that works in SQL but not in PHP 【发布时间】:2009-06-18 20:32:29 【问题描述】:我在插入一段 php 代码以检索一些数据时遇到了 SQL 查询问题。查询本身在 SQL 中完美运行,但是当我在我的 PHP 脚本中使用它时,它会显示“查询中的错误”然后背诵整个 SQL 语句。如果我将错误消息中的 SQL 语句直接复制并粘贴到 mysql 中,它会正常运行。
根据我的研究,我认为我在某处遗漏了撇号,因此 PHP 可能会混淆这些子句,但我没有足够的经验知道在哪里插入它们。
查询使用了一个名为 $userid 的变量,该变量在前面的 PHP 脚本中指定。
$sql= <<<END
SELECT sum(final_price)
FROM (
SELECT Table_A.rated_user_id, Table_B.seller, Table_B.final_price
FROM Table_A
INNER JOIN Table_B ON Table_A.id=Table_B.id
) AS total_bought
WHERE seller != $userid
AND rated_user_id = $userid
UNION ALL
SELECT sum(final_price)
FROM (
SELECT Table_A.rated_user_id, Table_C.seller, Table_C.final_price
FROM Table_A
INNER JOIN Table_C ON Table_A.id=Table_C.id
) AS total_bought
WHERE seller != $userid
AND rated_user_id = $userid
END;
在本节之后,脚本将继续定义输出并像往常一样回显必要的部分。我对代码的最后一部分感到满意,因为它可以在其他地方使用,但我遇到的问题似乎在上面的部分中。
谁能发现错误?
编辑添加了以下附加信息:
所有字段都是数值,没有一个是文本。我曾尝试放置“$userid”,但这只会使错误在错误结果中围绕该值显示“”。问题仍然相同。添加括号也没有帮助。在发布我的问题之前,我做了一些试验和错误。
如果有帮助,bieng使用的最后一部分代码如下:
$result = mysql_query($sql);
if (!$res)
die('Error: ' . mysql_error() . ' in query ' . $sql);
$total_bought = 0;
while ($row = mysql_fetch_array($result))
$total_bought += $row[0];
$total_bought = number_format($total_bought, 0);
echo '<b>Your purchases: ' . $total_bought . '</b>';
echo "<b> gold</b>";
【问题讨论】:
【参考方案1】:你正在检查!$res
,它应该是!$result
:
$result = mysql_query($sql);
if (!$result)
die('Error: ' . mysql_error() . ' in query ' . $sql);
【讨论】:
【参考方案2】:我想,你在某处echo()
ing 查询并从浏览器复制粘贴它。难道$userid
包含xml 标签?它们不会显示在浏览器中,您必须查看页面源才能发现它们。
【讨论】:
【参考方案3】:您应该使用引用 $userid 并在两个语句周围加上括号进行测试。
【讨论】:
【参考方案4】:我假设rated_user_id 是一个数字字段,但卖家是什么类型?如果是字符字段,则必须按照 streetpc 的建议引用 $userid。
要检查的另一件事是,查询的每一行在行尾后至少有一个空格。这以前让我绊倒过。有时,当从您的编辑器/IDE 转到数据库工具时,这些问题会得到解决。
【讨论】:
以上是关于在 SQL 中有效但在 PHP 中无效的查询的主要内容,如果未能解决你的问题,请参考以下文章
ORA-00900:PHP中无效的SQL语句,但在sqlplus中有效
SQL 查询在 phpMyAdmin 中有效,但在 Java 中无效
查询在 mysql 工作台中有效,但在 php 中无效,不知道为啥
SQL 查询字符串在 SQL Server Management Studio 中有效,但在带有 SQLCommand.ExecuteReader 的 VB.net 中无效