Projet Entreprise PDO PHP procédure stockée
Mickael_87
Messages postés
11
Date d'inscription
Statut
Membre
Dernière intervention
-
Mickael_87 Messages postés 11 Date d'inscription Statut Membre Dernière intervention -
Mickael_87 Messages postés 11 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
Je viens vers vous car mon entreprise pour laquelle je travaille m'a demandé de réalisé une page internet mais j'ai besoin d'aide.... Cette page doit (en inscrivant le codebarre d'un article) ressortir des tableaux (avec prix d'achat fournisseurs, vente sur les magasins...etc...).
Le problème est que j'ai ce message d'erreur : "la conversion de la valeur varchar ' 3700177566718' a dépassé une colonne int". Je comprend pas car la base prend des entiers et je passe des entiers.....
J'utilise PDO (enfin je pense l'utiliser), WAMPSERVER, APACHE 2.4.39 et PHP 5.6.40 et la base est SQL Server (pas MySQL).
Je suis débutant car je ne connaissait pas avant ce projet (et j'apprend sur le tas là). Je vous mets mon code si quelqu'un peut m'aider ça me sauverai là vie :
- REQUETE SQL QUE L'ON M'A DONNE :
- Mon code Php :
Ma deuxième question est comment récupérer les valeurs de retours en forme de tableau (comme je vous l'ai dit je suis vraiment débutant).
Merci à tous pour votre contribution.
Je viens vers vous car mon entreprise pour laquelle je travaille m'a demandé de réalisé une page internet mais j'ai besoin d'aide.... Cette page doit (en inscrivant le codebarre d'un article) ressortir des tableaux (avec prix d'achat fournisseurs, vente sur les magasins...etc...).
Le problème est que j'ai ce message d'erreur : "la conversion de la valeur varchar ' 3700177566718' a dépassé une colonne int". Je comprend pas car la base prend des entiers et je passe des entiers.....
J'utilise PDO (enfin je pense l'utiliser), WAMPSERVER, APACHE 2.4.39 et PHP 5.6.40 et la base est SQL Server (pas MySQL).
Je suis débutant car je ne connaissait pas avant ce projet (et j'apprend sur le tas là). Je vous mets mon code si quelqu'un peut m'aider ça me sauverai là vie :
- REQUETE SQL QUE L'ON M'A DONNE :
declare @art as numeric set @art = (select idarticle from art_gtin where gtin = @input) exec ps_cadenciermultisites @artnoid = @art
- Mon code Php :
//Nom du serveur $serverName = "serverName"; //serverName\instanceName $connectionInfo = array( "Database"=>"DATABASE", "UID"=>"UID", "PWD"=>"PWD"); //On lance la connexion à la base avec les deux paramètres aux dessus $conn = sqlsrv_connect( $serverName, $connectionInfo); if( $conn ) { echo "Connecté à la base de donnée SQL"; }else{ echo "Ne peut pas se connecté à la base de donnée"; //On affiche le message d'erreur die( print_r( sqlsrv_errors(), true)); } $article=$gencod + 0; var_dump($article); //Mes paramètres $params = array($article, "artnoid"); $params2 = array($article, "art"); //Ma 1ère requete $requete1="declare @art as integer set @art = (select idarticle from art_gtin where gtin = ".$article.")"; //Lancement de ma 1ère requete $stmt1=sqlsrv_query($conn, $requete1, $params2); //Test 1ère requete if ($stmt1===false){ echo "Pas bien 1ER"; die (print_r(sqlsrv_errors(),true)); }else{ echo "La requete 1 a bien été réalisé : ".$stmt1.""; } //Ma 2ème requete $requete2="exec ps_cadenciermultisites @artnoid = @art"; //Lancement de ma 2ème requete $stmt2=sqlsrv_query($conn, $requete2, $params, $params2); //Test 2ème requete if ($stmt2===false){ echo "Pas bien 2EME"; die (print_r(sqlsrv_errors(),true)); }else{ echo "La requete 2 a bien été réalisé : ".$stmt2.""; } //-----------------------------------------------------------------------------------// //-------------------------- FIN DE TEST ---------------------------// //-----------------------------------------------------------------------------------// //-------------------------- Fermer la connexion à la base de donnée ---------------------------// $free=sqlsrv_free_stmt($stmttest); if ($free){ echo ""; echo "STMT libérée"; } else{ echo "Ne peut pas se libérée"; } $close=sqlsrv_close($conn); if($close){ echo "Déconnecté"; }else { echo "N'arrive pas à se déconnecté"; } ?>
Ma deuxième question est comment récupérer les valeurs de retours en forme de tableau (comme je vous l'ai dit je suis vraiment débutant).
Merci à tous pour votre contribution.
EDIT : Ajout des balises de code.
Merci d'y penser à l'avenir....
A voir également:
- Projet Entreprise PDO PHP procédure stockée
- Clé windows 10 entreprise gratuit - Guide
- Organigramme d'une entreprise word - Guide
- Entreprise architecte - Télécharger - Gestion de projets
- Filigrane projet - Guide
- Easy php - Télécharger - Divers Web & Internet
6 réponses
Bonjour,
Déjà, non ce n'est pas vraiment du PDO (mais c'est assez proche )
Ensuite, ton erreur arrive sur quelle ligne ? quelle requête ?
Que t'affiche exactement ton
As tu testé la requête directement dans la bdd ?
As tu testé l'appel à tes procédures stockées directement dans la bdd ?
Car il semble que le souci provienne des requêtes/procédures elles mêmes ... et que ça ne soitpas un souci de code php...
NB: Pour poster ton code sur le forum, tu dois utiliser les balises de code.
https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code
Déjà, non ce n'est pas vraiment du PDO (mais c'est assez proche )
Ensuite, ton erreur arrive sur quelle ligne ? quelle requête ?
Que t'affiche exactement ton
var_dump($article);?
As tu testé la requête directement dans la bdd ?
As tu testé l'appel à tes procédures stockées directement dans la bdd ?
Car il semble que le souci provienne des requêtes/procédures elles mêmes ... et que ça ne soitpas un souci de code php...
NB: Pour poster ton code sur le forum, tu dois utiliser les balises de code.
https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code
Y'a un truc qui me parait étrange....
Tu passes DEUX variables dans tes params .... variables que tu n'utilises pas dans tes requêtes de toutes façons...
Je pense que tu n'as pas regardé la doc...
https://www.php.net/manual/fr/function.sqlsrv-query.php
Tu passes DEUX variables dans tes params .... variables que tu n'utilises pas dans tes requêtes de toutes façons...
Je pense que tu n'as pas regardé la doc...
https://www.php.net/manual/fr/function.sqlsrv-query.php
Je vais expliqué mon résonnement (me dire s'il est faux) :
La requête de base que l'on m'a donné est :
declare @art as numeric
set @art = (select idarticle from art_gtin where gtin = @input)
exec ps_cadenciermultisites @artnoid = @art
Le @input c'est ma variable $article (en php) où je récup avec un POST ce que tape au clavier l'utilisateur.
Dans la première stmt (donc stmt1) je mets params2 parce que $article (le @input) est utilisé pour SET le @art.
Et dans la deuxième stmt (donc stmt2) je mets params et params2 car :
- on a besoin de @art (qui est en fonction de $article)
- on a besoin de @artnoid (qui est fonction de $article car @artnoid = $art dans ma requête)
Après je me trompe très certainement (vu que mon code marche pas ;-p)
La requête de base que l'on m'a donné est :
declare @art as numeric
set @art = (select idarticle from art_gtin where gtin = @input)
exec ps_cadenciermultisites @artnoid = @art
Le @input c'est ma variable $article (en php) où je récup avec un POST ce que tape au clavier l'utilisateur.
Dans la première stmt (donc stmt1) je mets params2 parce que $article (le @input) est utilisé pour SET le @art.
Et dans la deuxième stmt (donc stmt2) je mets params et params2 car :
- on a besoin de @art (qui est en fonction de $article)
- on a besoin de @artnoid (qui est fonction de $article car @artnoid = $art dans ma requête)
Après je me trompe très certainement (vu que mon code marche pas ;-p)
Je vais te donner mon raisonnement....
Etape 1 ... lire et comprendre la documentation et les exemples donnés ici : https://www.php.net/manual/fr/function.sqlsrv-query.php
Etape 2 ... appliquer ce qui indiqué dans le lien...
Etape 3 Si ça ne fonctionne toujours pas.... recommencer à l'étape 1
L'utilisation du SET dans la requête n'a aucun intérêt...
Autant, directement, faire appel à ta requête
puis utiliser son résultat pour l'envoyer dans ta seconde requête....
NB: Pour lire le résultat d'une requête, tu dois en faire un fetch
par exemple :
https://www.php.net/manual/fr/function.mssql-fetch-row.php
Etape 1 ... lire et comprendre la documentation et les exemples donnés ici : https://www.php.net/manual/fr/function.sqlsrv-query.php
Etape 2 ... appliquer ce qui indiqué dans le lien...
Etape 3 Si ça ne fonctionne toujours pas.... recommencer à l'étape 1
:-)
En ce qui concerne ton code....L'utilisation du SET dans la requête n'a aucun intérêt...
Autant, directement, faire appel à ta requête
select idarticle from art_gtin where gtin = ".$article
puis utiliser son résultat pour l'envoyer dans ta seconde requête....
NB: Pour lire le résultat d'une requête, tu dois en faire un fetch
par exemple :
https://www.php.net/manual/fr/function.mssql-fetch-row.php
Etape 1 : J'ai lu et re relu c'est par ailleurs comme ça que j'ai fait ce code parce que je connaissait pas du tout avant.. Mais peut être pas tout compris
Etape 2 : ...du coup j'ai essayé de mettre en application ce qui est indiqué dans le liens...
Etape 3 : Je vais re-lire les docs :-)
En ce qui concerne mon code :
Je n'ai pas la main sur la requete et sur la bdd en gros même si le SET sert à rien comme on m'impose de faire avec cette requête je peux pas la bidouyer
Etape 2 : ...du coup j'ai essayé de mettre en application ce qui est indiqué dans le liens...
Etape 3 : Je vais re-lire les docs :-)
En ce qui concerne mon code :
Je n'ai pas la main sur la requete et sur la bdd en gros même si le SET sert à rien comme on m'impose de faire avec cette requête je peux pas la bidouyer
Quand je fais qu'une seule requête le temps de réponse est super long et cela me met ce message d'erreur :
Array ( [0] => Array ( [0] => 08001 [SQLSTATE] => 08001 [1] => 53 [code] => 53 [2] => [Microsoft][ODBC Driver 11 for SQL Server]Fournisseur de canaux nomm�s : Impossible d'ouvrir une connexion � SQL Server [53]. [message] => [Microsoft][ODBC Driver 11 for SQL Server]Fournisseur de canaux nomm�s : Impossible d'ouvrir une connexion � SQL Server [53]. ) [1] => Array ( [0] => HYT00 [SQLSTATE] => HYT00 [1] => 0 [code] => 0 [2] => [Microsoft][ODBC Driver 11 for SQL Server]D�lai d'attente de connexion expir� [message] => [Microsoft][ODBC Driver 11 for SQL Server]D�lai d'attente de connexion expir� ) [2] => Array ( [0] => 08001 [SQLSTATE] => 08001 [1] => 53 [code] => 53 [2] => [Microsoft][ODBC Driver 11 for SQL Server]Une erreur li�e au r�seau ou sp�cifique � l'instance s'est produite lors de l'�tablissement d'une connexion � SQL Server. Le serveur est introuvable ou n'est pas accessible. V�rifiez si le nom de l'instance est correct et si SQL Server est configur� pour autoriser les connexions distantes. Pour plus d'informations, consultez la documentation en ligne de SQL Server. [message] => [Microsoft][ODBC Driver 11 for SQL Server]Une erreur li�e au r�seau ou sp�cifique � l'instance s'est produite lors de l'�tablissement d'une connexion � SQL Server. Le serveur est introuvable ou n'est pas accessible. V�rifiez si le nom de l'instance est correct et si SQL Server est configur� pour autoriser les connexions distantes. Pour plus d'informations, consultez la documentation en ligne de SQL Server. ) )
Array ( [0] => Array ( [0] => 08001 [SQLSTATE] => 08001 [1] => 53 [code] => 53 [2] => [Microsoft][ODBC Driver 11 for SQL Server]Fournisseur de canaux nomm�s : Impossible d'ouvrir une connexion � SQL Server [53]. [message] => [Microsoft][ODBC Driver 11 for SQL Server]Fournisseur de canaux nomm�s : Impossible d'ouvrir une connexion � SQL Server [53]. ) [1] => Array ( [0] => HYT00 [SQLSTATE] => HYT00 [1] => 0 [code] => 0 [2] => [Microsoft][ODBC Driver 11 for SQL Server]D�lai d'attente de connexion expir� [message] => [Microsoft][ODBC Driver 11 for SQL Server]D�lai d'attente de connexion expir� ) [2] => Array ( [0] => 08001 [SQLSTATE] => 08001 [1] => 53 [code] => 53 [2] => [Microsoft][ODBC Driver 11 for SQL Server]Une erreur li�e au r�seau ou sp�cifique � l'instance s'est produite lors de l'�tablissement d'une connexion � SQL Server. Le serveur est introuvable ou n'est pas accessible. V�rifiez si le nom de l'instance est correct et si SQL Server est configur� pour autoriser les connexions distantes. Pour plus d'informations, consultez la documentation en ligne de SQL Server. [message] => [Microsoft][ODBC Driver 11 for SQL Server]Une erreur li�e au r�seau ou sp�cifique � l'instance s'est produite lors de l'�tablissement d'une connexion � SQL Server. Le serveur est introuvable ou n'est pas accessible. V�rifiez si le nom de l'instance est correct et si SQL Server est configur� pour autoriser les connexions distantes. Pour plus d'informations, consultez la documentation en ligne de SQL Server. ) )
La lenteur est sûrement en rapport avec le message ....
Visiblement... ton code n'arrive pas à se connecter au serveur.... rien à voir avec le fait que tu fasses deux requêtes ou une seule.
De plus, (ça fait longtemps que j'ai pas touché à un sql serveur... ), ne faut-il pas séparer chaque instruction de ta requête par un point-virgule ? )
Tu n'as pas du bien lire les exemples du lien que je t'ai donné....
il faut utiliser des points d'interrogation pour les variables.... et passer autant de variables dans ton array que tu as de points d'interrogations dans ta requête.....
En gros, Ton code, devrait ressembler à ça :
Par contre si le message d'erreur continue d'indiquer que tu n'as pas pu te connecter.... ben... c'est que tu as un souci dans le code de connexion à la bdd ....
Visiblement... ton code n'arrive pas à se connecter au serveur.... rien à voir avec le fait que tu fasses deux requêtes ou une seule.
De plus, (ça fait longtemps que j'ai pas touché à un sql serveur... ), ne faut-il pas séparer chaque instruction de ta requête par un point-virgule ? )
Tu n'as pas du bien lire les exemples du lien que je t'ai donné....
il faut utiliser des points d'interrogation pour les variables.... et passer autant de variables dans ton array que tu as de points d'interrogations dans ta requête.....
En gros, Ton code, devrait ressembler à ça :
$params = array($article); $requete = "declare @art as integer; set @art = (select idarticle from art_gtin where gtin = ?); exec ps_cadenciermultisites @artnoid = @art"; $stmt1=sqlsrv_query($conn, $requete, $params);
Par contre si le message d'erreur continue d'indiquer que tu n'as pas pu te connecter.... ben... c'est que tu as un souci dans le code de connexion à la bdd ....
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Nouveau Problème : Message Erreur :
Array ( [0] => Array ( [0] => 22003 [SQLSTATE] => 22003 [1] => 248 [code] => 248 [2] => [Microsoft][ODBC Driver 11 for SQL Server][SQL Server]La conversion de la valeur varchar ' 3700177566718' a d�pass� une colonne int. [message] => [Microsoft][ODBC Driver 11 for SQL Server][SQL Server]La conversion de la valeur varchar ' 3700177566718' a d�pass� une colonne int. ) )
C'est le même message d'erreur qu'au tout début ....
Array ( [0] => Array ( [0] => 22003 [SQLSTATE] => 22003 [1] => 248 [code] => 248 [2] => [Microsoft][ODBC Driver 11 for SQL Server][SQL Server]La conversion de la valeur varchar ' 3700177566718' a d�pass� une colonne int. [message] => [Microsoft][ODBC Driver 11 for SQL Server][SQL Server]La conversion de la valeur varchar ' 3700177566718' a d�pass� une colonne int. ) )
C'est le même message d'erreur qu'au tout début ....
On reprend...
As tu le message d'erreur si tu ne fais que ça ?
Ensuite, tu feras le même test avec ça
EDIT : En regardant bien ton message d'erreur... il semble que le nombre ait un espace devant
Essaye de voir si en retirant l'espace après le = ça corrige le souci
Cela peut aussi venir de la données contenue dans la table...
Que contient exactement le résultat de la requête
Tu peux éventuellement essayer d'en faire un CAST
https://sql.sh/fonctions/cast
.
As tu le message d'erreur si tu ne fais que ça ?
$params = array($article); $requete = "declare @art as integer; set @art = (select idarticle from art_gtin where gtin = ?); $stmt1=sqlsrv_query($conn, $requete, $params);
Ensuite, tu feras le même test avec ça
$params = array($article); $requete = "exec ps_cadenciermultisites @artnoid = 3700177566718 "; $stmt1=sqlsrv_query($conn, $requete, $params);
EDIT : En regardant bien ton message d'erreur... il semble que le nombre ait un espace devant
' 3700177566718'
Essaye de voir si en retirant l'espace après le = ça corrige le souci
set @art =(select idarticle from art_gtin where gtin = ?);
Cela peut aussi venir de la données contenue dans la table...
Que contient exactement le résultat de la requête
select idarticle from art_gtin where gtin = 115715
Tu peux éventuellement essayer d'en faire un CAST
https://sql.sh/fonctions/cast
.
Alors :
1er Test : Même Message d'erreur
2ème Test : Plus de message d'erreur mais je ne passe plus mon 115715 ni rien d'autre d'ailleurs...
3ème test : Même Message d'erreur
4ème Test : Le SELECT idarticle etc.. me donne encore le même message d'erreur à savoir :
Array ( [0] => Array ( [0] => 22003 [SQLSTATE] => 22003 [1] => 248 [code] => 248 [2] => [Microsoft][ODBC Driver 11 for SQL Server][SQL Server]La conversion de la valeur varchar ' 3700177566718' a d�pass� une colonne int. [message] => [Microsoft][ODBC Driver 11 for SQL Server][SQL Server]La conversion de la valeur varchar ' 3700177566718' a d�pass� une colonne int. ) )
1er Test : Même Message d'erreur
2ème Test : Plus de message d'erreur mais je ne passe plus mon 115715 ni rien d'autre d'ailleurs...
3ème test : Même Message d'erreur
4ème Test : Le SELECT idarticle etc.. me donne encore le même message d'erreur à savoir :
Array ( [0] => Array ( [0] => 22003 [SQLSTATE] => 22003 [1] => 248 [code] => 248 [2] => [Microsoft][ODBC Driver 11 for SQL Server][SQL Server]La conversion de la valeur varchar ' 3700177566718' a d�pass� une colonne int. [message] => [Microsoft][ODBC Driver 11 for SQL Server][SQL Server]La conversion de la valeur varchar ' 3700177566718' a d�pass� une colonne int. ) )
Et en faisant ce test
Cela me met ce message d'erreur : Array ( [0] => Array ( [0] => 42000 [SQLSTATE] => 42000 [1] => 102 [code] => 102 [2] => [Microsoft][ODBC Driver 11 for SQL Server][SQL Server]Syntaxe incorrecte vers 'INTEGER'. [message] => [Microsoft][ODBC Driver 11 for SQL Server][SQL Server]Syntaxe incorrecte vers 'INTEGER'. ) )
Et ça je pense pas que je puisse le faire parce que mon patron m'a mis qu'un accés en lecture seule sur la bdd..
$requetetest="SELECT CAST(idarticle AS SIGNED INTEGER) AS idarticle_cast FROM art_gtin where gtin = 115715";
Cela me met ce message d'erreur : Array ( [0] => Array ( [0] => 42000 [SQLSTATE] => 42000 [1] => 102 [code] => 102 [2] => [Microsoft][ODBC Driver 11 for SQL Server][SQL Server]Syntaxe incorrecte vers 'INTEGER'. [message] => [Microsoft][ODBC Driver 11 for SQL Server][SQL Server]Syntaxe incorrecte vers 'INTEGER'. ) )
Et ça je pense pas que je puisse le faire parce que mon patron m'a mis qu'un accés en lecture seule sur la bdd..
C'est bon j'ai réussi à enlever ce "La conversion de la valeur varchar ' 3700177566718' a d�pass� une colonne int" en mettant des simples cote autour du ? dans la requete.
Une autre question le traitement des résultats (et là j'ai trouver nul part) :
Comment faire pour récup le résultat de ma requete sachant qu'on ne m'a pas donné le nom des colonnes des tables de la bdd (j'ai eu aucune info sur la bdd en fait) et que ma page doit ressembler à ça :
Une autre question le traitement des résultats (et là j'ai trouver nul part) :
Comment faire pour récup le résultat de ma requete sachant qu'on ne m'a pas donné le nom des colonnes des tables de la bdd (j'ai eu aucune info sur la bdd en fait) et que ma page doit ressembler à ça :

Déjà merci d'avoir pris le temps de me répondre.
Pour l'histoire du PDO comme je connaissait pas avant que l'on me donne ce projet je savais pas vraiment si c'était du PDO ou pas (d'où mon : "enfin je pense l'utiliser").
Ensuite, c'est une requête que mon patron m'a donnée et il la testé directement dans sa bdd elle marche. Pareil pour la procédure.
Enfin l'erreur du $stmt1=sqlsrv_query($conn, $requete1, $params2); en gros lorsque je fais ma première requète et mon var_dump($article) m'affiche C:\wamp\www\test\codephp.php:160:int 115715 (en vert et mon patron m'a demandé de tester avec ce nombre 115715)