Projet Entreprise PDO PHP procédure stockée

Fermé
Mickael_87 Messages postés 11 Date d'inscription jeudi 26 septembre 2019 Statut Membre Dernière intervention 27 septembre 2019 - Modifié le 26 sept. 2019 à 13:51
Mickael_87 Messages postés 11 Date d'inscription jeudi 26 septembre 2019 Statut Membre Dernière intervention 27 septembre 2019 - 27 sept. 2019 à 15:43
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 :
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:

6 réponses

jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650
26 sept. 2019 à 13:55
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
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

0
Mickael_87 Messages postés 11 Date d'inscription jeudi 26 septembre 2019 Statut Membre Dernière intervention 27 septembre 2019
26 sept. 2019 à 16:30
Bonjour,
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)
0
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650
27 sept. 2019 à 10:11
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

0
Mickael_87 Messages postés 11 Date d'inscription jeudi 26 septembre 2019 Statut Membre Dernière intervention 27 septembre 2019
27 sept. 2019 à 10:45
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)
0
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650
Modifié le 27 sept. 2019 à 11:40
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

:-)

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
0
Mickael_87 Messages postés 11 Date d'inscription jeudi 26 septembre 2019 Statut Membre Dernière intervention 27 septembre 2019
Modifié le 27 sept. 2019 à 12:11
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
0
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650 > Mickael_87 Messages postés 11 Date d'inscription jeudi 26 septembre 2019 Statut Membre Dernière intervention 27 septembre 2019
27 sept. 2019 à 12:16
Si tu veux conserver le "SET" .. ne découpe pas ton code en deux...
Ne fait qu'une seule requête...
0
Mickael_87 Messages postés 11 Date d'inscription jeudi 26 septembre 2019 Statut Membre Dernière intervention 27 septembre 2019
27 sept. 2019 à 12:20
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. ) )
0
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650 > Mickael_87 Messages postés 11 Date d'inscription jeudi 26 septembre 2019 Statut Membre Dernière intervention 27 septembre 2019
27 sept. 2019 à 12:27
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 :
$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 ....
0
Mickael_87 Messages postés 11 Date d'inscription jeudi 26 septembre 2019 Statut Membre Dernière intervention 27 septembre 2019
27 sept. 2019 à 11:01
Et ma page doit être comme ça (j'ai caché des informations de mon entreprise) :


Je viens de faire tester la requête sur la bdd elle fonctionne bien et donne un tas d'info (présent sur cette image mais caché) sur les 3 magasins mais dans 1 seul tableau
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Mickael_87 Messages postés 11 Date d'inscription jeudi 26 septembre 2019 Statut Membre Dernière intervention 27 septembre 2019
27 sept. 2019 à 13:41
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 ....
0
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650
27 sept. 2019 à 13:51
On reprend...

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


.
0
Mickael_87 Messages postés 11 Date d'inscription jeudi 26 septembre 2019 Statut Membre Dernière intervention 27 septembre 2019
27 sept. 2019 à 14:17
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. ) )
0
Mickael_87 Messages postés 11 Date d'inscription jeudi 26 septembre 2019 Statut Membre Dernière intervention 27 septembre 2019
27 sept. 2019 à 14:33
Et en faisant ce test
$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..
0
Mickael_87 Messages postés 11 Date d'inscription jeudi 26 septembre 2019 Statut Membre Dernière intervention 27 septembre 2019
27 sept. 2019 à 15:43
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 :
0