簡體   English   中英

smarty -sql查詢-其中id子句是另一個查詢的結果

[英]smarty -sql query - where id clause is the result of another query

對於合作伙伴數據,我需要合作伙伴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)在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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM