Для данных партнера мне нужен идентификатор партнера для привязки к 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. Вы используете значение cbid из параметров $ _GET без их очистки или использования параметров запроса.
Так что попробуйте это:
«… где partner.id = ‘{$ contract [‘ pid ‘]}'»
и, пожалуйста, исправьте SQL-инъекцию :). Лучший подход — использовать параметры запроса, которые в первую очередь позволяют избежать многих проблем с интерполяцией строк. http://php.net/manual/en/mysqli.quickstart.prepared-statements.php
Других решений пока нет …