【问题标题】:smarty -sql query - where id clause is the result of another querysmarty -sql 查询 - 其中 id 子句是另一个查询的结果
【发布时间】:2015-03-10 14:54:45
【问题描述】:

对于合作伙伴数据,我需要合作伙伴 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;

 }

【问题讨论】:

  • 检查您的加入声明
  • 什么是billing.contract_body
  • @WorkSmarter:在平面 php 中都很好。
  • @AlejandroIván 计费架构中的一个表。
  • 我几乎可以肯定JOIN 是你的问题... SELECT * FROM billing.contract_body cbody JOIN billing.contract_stub cstub ON cbody.stub=cstub.id WHERE cbody.id=$cbid 呢?此外,查看表格的结构会有所帮助

标签: php mysql smarty smarty3


【解决方案1】:

有几个可能的问题:

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

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

"总是在字符串字面量数组索引周围使用引号。例如,$foo['bar'] 是正确的,而 $foo[bar] 是不正确的。但是为什么呢?在 old 中经常会遇到这种语法脚本:"

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

3) 在 sql equals 比较中,在值周围加上单引号是合适的。其中 table.column = '值';根据所涉及的数据类型,它可能会在没有的情况下工作。

4) 您的代码会受到 sql 注入的影响。您正在使用 $_GET 参数中的 cbid 值,而没有对其进行清理或使用查询参数。

所以试试这个:

" ... where partner.id='{$contract['pid']}' "

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

【讨论】:

    猜你喜欢
    • 2012-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-08
    • 1970-01-01
    • 1970-01-01
    • 2017-05-29
    相关资源
    最近更新 更多