Я столкнулся с проблемой с библиотекой ADOdb PHP (https://sourceforge.net/projects/adodb/) и MSSQL Server 2012
Я делаю простой оператор обновления с заполнителем, как этот, но он терпит неудачу, говоря, что я не дал достаточно параметров для функции Execute:
UPDATE report SET custom='Is this ok?' WHERE ID = ?
Я проверил adodb-mssql.inc.php и в функции Prepare просто заменить каждый? с синтаксисом @P для MSSQL вместо проверки того, что является Заполнителем, а что нет:
function Prepare($sql)
{
$sqlarr = explode('?',$sql);
if (sizeof($sqlarr) <= 1) return $sql;
$sql2 = $sqlarr[0];
for ($i = 1, $max = sizeof($sqlarr); $i < $max; $i++) {
$sql2 .= '@P'.($i-1) . $sqlarr[$i];
}
return array($sql,$this->qstr($sql2),$max,$sql2);
}
Таким образом, в моем запросе я получаю 2 параметра @P (@ P0 внутри кавычек (не предназначен для использования в качестве заполнителя), @ P1 в качестве реального заполнителя), что приводит к уже упомянутой ошибке, поскольку я даю вместо параметра «Выполнить 1» только параметр вместо «вместо». два.
Это предел знаний библиотеки ADOdb? Нужно ли проверять каждое поле и заменять знак вопроса, не используемый в качестве заполнителя, чем-то другим перед выполнением запроса, или я что-то упустил?
Я был просматривая код. Эта библиотека ужасно устарела (она написана для PHP / 4!), А драйвер mssql особенно плох. Возможно, вам повезет больше, если вы сможете использовать драйверы PDO или SQLSRV (по крайней мере, они, по-видимому, используют встроенные подготовленные операторы), но я думаю, что это существующее устаревшее приложение, или вы не будете использовать такую библиотеку в первую очередь.
Если вы не можете переключать драйверы (или это не решает проблему), я думаю, вам придется смириться с ошибкой и передать статические строки в качестве параметров, повернув это:
$sql = "UPDATE report SET custom='Is this ok?' WHERE ID = ?";
… в это:
$sql = "UPDATE report SET custom = ? WHERE ID = ?";
Если вы не пытаетесь получить доступ к базе данных через FreeTDS или подобное, вы используете неправильный драйвер. Вы должны использовать драйвер mssqlnative ADOdb, который изначально был представлен проекту Microsoft.
Если у вас все еще есть проблемы, вы должны отправить вопрос на Github, чтобы увидеть, может ли это быть решено в драйвере