smarty -sql query - 其中id子句是另一个查询的结果

时间:2015-03-10 14:54:45

标签: php mysql smarty smarty3

对于合作伙伴数据,我需要合作伙伴ID来对应合同结果中的pid。我从合同数据中得到了查询结果,得到了合同数据,然后我需要将partner.id作为contract.pid。保存时,我收到此错误:

查询失败:您的SQL语法出错;检查与MySQL服务器版本对应的手册,以便在第3行的''附近使用正确的语法

require "$_SERVER[DOCUMENT_ROOT]/billing/server/Smarty/libs/Smarty.class.php";
require_once "$_SERVER[DOCUMENT_ROOT]/common/server/engine.php";

// required args 
$cbid = $_GET['cbid'];
//$smarty->force_compile = true;
$smarty->debugging = true;
$smarty->caching = true;
$smarty->cache_lifetime = 120;

// ------- contract data ------
$sql = "
SELECT *
FROM billing.contract_body
JOIN billing.contract_stub ON stub=contract_stub.id
WHERE contract_body.id=$cbid    

 ";
$result = mysql_query($sql) or die ("Query failed : " . mysql_error());
while ($contract = mysql_fetch_assoc($result))
 {
$value[] = $contract;
 }
$smarty->assign('contract', $value);




 // ------- partner data ------
$sql = "
SELECT *
FROM common.partner
    WHERE partner.id=$contract[pid] 

    ";
$result = mysql_query($sql) or die ("Query failed : " . mysql_error());
while ($partner = mysql_fetch_assoc($result))
 {
$value[] = $partner;

 }

1 个答案:

答案 0 :(得分:0)

有一些可能的问题:

1)在php字符串中插入数组元素时,你应该使用{}。我认为不同的(较旧的)版本的php处理案例没有{}不同(很难获得对旧版本php的文档的引用)。该值很容易被解释为'',这将导致sql错误。您可以通过打印出正在执行的实际sql字符串来确认这一点 - 如果缺少该值,则这将是问题所在。我个人总是对除简单变量“$ myvar”

之外的每个表达式使用{}语法

2)$ contract [pid]可能无效。 pid将被解释为常量(DEFINE)(可能解析为'pid')。我猜你的意思是:$ contract ['pid']。不幸的是,php文档在这方面并不一致 - 有些示例显示没有引号的用法,有些部分明确指出了问题:

  

“总是在字符串文字数组索引周围使用引号。例如,$ foo ['bar']是正确的,而$ foo [bar]则不是。但为什么?在旧版本中遇到这种语法很常见脚本:“

http://php.net/manual/en/language.types.array.php

3)在sql equals比较中围绕值放置单引号是合适的。 table.column ='value';根据所涉及的数据类型,它可能没有用。

4)您的代码需要sql注入。您正在使用$ _GET参数中的cbid值,而不对其进行清理或使用查询参数。

所以试试这个:

“...其中partner.id ='{$ contract ['pid']}'”

并且请修复你的sql注入:)最好的方法是使用查询参数,这首先避免了字符串插值的大部分问题。 http://php.net/manual/en/mysqli.quickstart.prepared-statements.php