smarty -sql запрос — где предложение 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

Решение

Есть несколько возможных проблем:

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. Вы используете значение cbid из параметров $ _GET без их очистки или использования параметров запроса.

Так что попробуйте это:

«… где partner.id = ‘{$ contract [‘ pid ‘]}'»

и, пожалуйста, исправьте SQL-инъекцию :). Лучший подход — использовать параметры запроса, которые в первую очередь позволяют избежать многих проблем с интерполяцией строк. http://php.net/manual/en/mysqli.quickstart.prepared-statements.php

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]