2016-03-31 2 views
1

Je suis en cours d'exécution dans un problème avec la bibliothèque PHP ADOdb (https://sourceforge.net/projects/adodb/) et MSSQL Server 2012Question numéro de marque avec ADOdb et MSSQL

Je fais une simple déclaration de mise à jour avec un espace réservé, comme celui-ci, mais il ne parvient dire que je ne donne pas assez de paramètres à la fonction Exécuter:

UPDATE report SET custom='Is this ok?' WHERE ID = ?

J'ai vérifié les adodb-mssql.inc.php et dans la fonction Préparer simple remplacer tous? avec la syntaxe de @P pour MSSQL, au lieu de vérifier ce qui est un paramètre fictif et ce n'est pas:

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); 
} 

Donc, dans ma requête je reçois 2 @P params (@ P0 à l'intérieur des guillemets (non prévu comme un espace réservé) , @ P1 en tant que vrai espace réservé), entraînant déjà cette erreur car je ne donne que la fonction Execute 1 à remplacer au lieu de deux.

Est-ce une limite connue de la bibliothèque ADOdb? Dois-je vérifier chaque champ et remplacer le point d'interrogation non utilisé comme espace réservé par quelque chose de différent avant d'exécuter la requête ou est-ce que je manque quelque chose?

+0

Ceci est une limitation connue des outils sans fin qui simulent des déclarations préparées à l'aide de remplacement de chaîne stupide. Mais cela semble trop mauvais pour être vrai. Etes-vous sûr d'avoir récupéré la dernière version disponible? –

+0

5.18, mise à niveau vers 5.20 juste maintenant pour tester si cela a été corrigé, mais la fonction de préparation est la même dans les deux versions. EDIT: Mise à niveau vers 5.20, même numéro: Avertissement: mssql_query(): message: Doit déclarer la variable scalaire "@ P1". – Cusy

Répondre

1

J'ai été browsing the code. Cette librairie est terriblement obsolète (elle est écrite pour PHP/4!) Et le pilote mssql est particulièrement mauvais. Vous pourriez avoir plus de chance si vous pouvez utiliser les pilotes PDO ou SQLSRV (au moins, ils semblent utiliser des instructions préparées natives), mais je suppose que c'est une application existante existante ou vous n'utiliserez pas une telle bibliothèque en premier lieu.

Si vous ne pouvez pas changer les pilotes (ou cela ne crée résout pas la question) Je pense que vous aurez à vivre avec le virus et passer des chaînes statiques comme paramètres aussi bien, tourner ceci:

$sql = "UPDATE report SET custom='Is this ok?' WHERE ID = ?"; 

... dans ce:

$sql = "UPDATE report SET custom = ? WHERE ID = ?"; 
0

à moins que vous essayez d'accéder à la base de données via FreeTDS ou similaire, vous utilisez le mauvais pilote. Vous devez utiliser le pilote mssqlnative ADOdb, qui a été initialement soumis au projet par Microsoft.

Si vous avez encore des problèmes, vous devez soumettre une question à Github, pour voir si cela peut être résolu dans le pilote