Syntax error [SQL] => UPDATE tFruits SET name = :name WHERE id = :id

Messages postés
84
Date d'inscription
mardi 13 janvier 2009
Dernière intervention
29 janvier 2019
- - Dernière réponse : jordane45
Messages postés
24381
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
3 février 2019
- 29 janv. 2019 à 18:54
Bonjour cher tous,

J'ai encore besoin de votre aide.

NB: Mon appli est un REST en php utilisant SQL Server comme base de donnée

Après avoir executé mon code dans POSTMAN voici l'erreur que j'obtiens:
Array
(
[ERROR] => Erreur ! SQLSTATE[07002]: [Microsoft][ODBC Driver 13 for SQL Server]COUNT field incorrect or syntax error
[SQL] => UPDATE tFruits SET name = :name WHERE id = :id
[datas] =>
)


Voici le contenu du fichier executé => create_fruit.php:
<?php
// required headers
header("Access-Control-Allow-Origin: *");
header("Content-Type: application/json; charset=UTF-8");
header("Access-Control-Allow-Methods: POST");
header("Access-Control-Max-Age: 3600");
header("Access-Control-Allow-Headers: Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With");

// get database connection
include_once '../config/dbase.php';

// instantiate fruit object
include_once '../objects/tfruits.php';

$database = new Database();
//$db = $database->getConnection();

$fruit = new Fruit();

// get posted data
$data = json_decode(file_get_contents("php://input"));

// make sure data is not empty
if(!empty($data->name))
{

// set fruit property values
$fruit->name = $data->name;

// create the fruit
if($fruit->create()){

// set response code - 201 created
http_response_code(201);

// tell the user
echo json_encode(array("message" => "fruit was created."));
}

// if unable to create the fruit, tell the user
else{

// set response code - 503 service unavailable
http_response_code(503);

// tell the user
echo json_encode(array("message" => "Unable to create fruit."));
}
}

// tell the user data is incomplete
else{

// set response code - 400 bad request
http_response_code(400);

// tell the user
echo json_encode(array("message" => "Unable to create fruit. Data is incomplete."));
}
?>


En suite le fichier contenant les fonctions(Ici c'est la fonction "create()" qui est utilisee) => tfruits.php:
<?php
class Fruit extends Database{
// Nom de la table
private $table_name = "tFruits";

// object properties
public $id;
public $name;

// constructor of database connection
public function __construct(){
parent::__construct();
}

/**
  • Retourne la liste des fruits * return Array */ function read(){ // select all query $query = "SELECT id, name FROM " . $this->table_name . " ORDER BY id ASC"; $result = $this->db_All($query); return $result; } /** * Retourne Un des fruits en fonction de son id * param : id -> id d'un fruit * return Array contenant les infos d'un fruit */ function get_FruitById($id){ // select all query $query = "SELECT id, name FROM " . $this->table_name . " WHERE id =:id ORDER BY id ASC"; $datas = array(':id'=>$id); $result = $this->db_One($query,$datas); return $result; } // create product function create(){ // query to insert record $query = "INSERT INTO" . $this->table_name . " SET name=:name"; $result = $this->db_exec($query); // sanitize $this->name=htmlspecialchars(strip_tags($this->name)); // bind values $result->bindParam(":name", $this->name); // execute query if($result->execute()){ return true; } return false; } }?>


le fichier de connexion à la base de donnée =>dbase.php :
<?php
class Database {

protected $connexion_bdd;

function __construct() {
try{
$this->connexion_bdd = new PDO('sqlsrv:Server=DATA-SERVER\CHATBOTSERVER;Database=chatbotdb', 'sa', 'Germain09');
// Fixe les options d'erreur (ici nous utiliserons les exceptions)
$this->connexion_bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch(PDOException $e) {
die('Erreur : ' . $e->getMessage());
}
}


private function requete($requete,$datas=NULL) {
try{
$prepare = $this->connexion_bdd->prepare($requete);
$prepare->execute($datas);
return $prepare;
}catch(Exception $e){
// en cas d'erreur :
print_r (array('ERROR'=>" Erreur ! ".$e->getMessage(),'SQL'=>$requete, 'datas'=>$datas));
exit();
}
}

/**
  • Retourne tous les enregistrements d'une requête SELECT */ public function db_All($sql,$datas=NULL){ $prep = $this->requete($sql,$datas); return $prep->fetchAll() ; } /** * Retourne le premier enregistrements d'une requête SELECT */ public function db_One($sql,$datas=NULL){ $prep = $this->requete($sql,$datas); return $prep->fetch(); } /** * Permet d'exécuter n'importe quel type de requête * A utiliser pour autre chose que les selects... */ public function db_exec($sql,$datas=NULL){ return $this->requete($sql,$datas); } } ?>


Voila, donc lorsque j'execute le fichier create_fruit.php, voici l'erreur générée:
Array
(
[ERROR] => Erreur ! SQLSTATE[07002]: [Microsoft][ODBC Driver 13 for SQL Server]COUNT field incorrect or syntax error
[SQL] => UPDATE tFruits SET name = :name WHERE id = :id
[datas] =>
)


Merci d'avance pour votre aide
Afficher la suite 

Votre réponse

7 réponses

Messages postés
24381
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
3 février 2019
359
0
Merci
Pour commencer... (je ne vais pas te le répéter à chacune de tes questions !!!! ) il serait bien que tu postes ton code correctement !
en précisant, dans les balises de code, le langage.... histoire qu'on puisse avoir la coloration syntaxique et l'indentation.
La .. ton code est illisible !

Au cas où... voici les explications (à lire ENTIEREMENT )
https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code

Ensuite, vu le message d'erreur... tu semble avoir envoyé la requête SQL .. mais ne pas avoir précisé de datas...
La fonction db_exec attend un array contenant les datas
/**
    * Permet d'exécuter n'importe quel type de requête
    * A utiliser pour autre chose que les selects...
    */
    public function db_exec($sql,$datas=NULL){
      return $this->requete($sql,$datas);
    }


donc soit tu construits l'array avant d'appeler la fonction
$sql = "UPDATE tFruits SET name = :name WHERE id = :id";
$datas = array(':name'=>"test",':id'=>1);

db_exec($sql,$datas);



Soit, si tu veux faire absolument du BIND, il faut créer une nouvelle fonction à la place de db_exec

function db_prep($sql){
  return  $this->connexion_bdd->prepare($sql);
}

puis faire ton BIND
puis faire le execute


Perso.. je préfère la première solution.


PS: Deux remarques :
- La syntaxe INSERT ... SET ... n'est valable que pour mysql et est fortement déconseillée.
Renseigne toi sur la vraie syntaxe de INSERT en SQL.
- La fonction htmlspecialchar ne doit être utilisée que pour l'affichage .. en aucun cas pour stocker les données en BDD !








Cordialement, 
Jordane                                                                 
lemega
Messages postés
84
Date d'inscription
mardi 13 janvier 2009
Dernière intervention
29 janvier 2019
-
Merci Jordane,
Vous avez parfaitement raison.
Au fait, cet API je l'ai fait sur MySQL et marche parfaitement.
Maintenant je veux utiliser SQL SERVER.
jordane45
Messages postés
24381
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
3 février 2019
359 > lemega
Messages postés
84
Date d'inscription
mardi 13 janvier 2009
Dernière intervention
29 janvier 2019
-
donc attention avec la syntaxe SQL....

INSERT ... SET.. ça ne marchera pas en SqlServer....

Et pour les requêtes préparées .. tu ne peux plus utiliser de paramètres nommés.
Il faut utiliser les "?" (et attention à respecter l'ordre pour qu'il corresponde à celui des la requete)
Donc :
$sql = "UPDATE tFruits SET name = :name WHERE id = :id";
$datas = array(':name'=>"test",':id'=>1);

db_exec($sql,$datas);

est à remplacer par :
$sql = "UPDATE tFruits SET name = ? WHERE id = ?";
$datas = array("test",1);

db_exec($sql,$datas);
Commenter la réponse de jordane45
Messages postés
84
Date d'inscription
mardi 13 janvier 2009
Dernière intervention
29 janvier 2019
0
Merci
Merci,

Ces lignes de code seront dans fonction Update() pour faire les mises a jour.
Mais je ne comprends pas cette ligne
$datas = array("test",1);

Je constate que les données sont en dure.
j'ai pensee a faire ceci
function update(){
		 
			// update query
			$query = "UPDATE " . $this->table_name . " SET name = ? WHERE id = ?";
			$datas = array($name,$id);
			
			db_exec($query,$datas);
		 
			return false;
		}
jordane45
Messages postés
24381
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
3 février 2019
359 -
Oui c'est ça
Commenter la réponse de lemega
Messages postés
84
Date d'inscription
mardi 13 janvier 2009
Dernière intervention
29 janvier 2019
0
Merci
Prrrrfffffff.... ça me rend dingue.....

ça ne fonctionne pas, malgré toutes ces heures passées a bosser dessus.

Voila ma demarche:
1 - dans le fichier dbase.php
/**
		  * Permet d'exécuter n'importe quel type de requête
		  * A utiliser pour autre chose que les selects...
		  */
		  public function db_exec($sql,$datas=NULL){
			return $this->requete($sql,$datas);
		  }


2- dans le fichier tfruitss.php, je cree la fonction update();
// update the product
		function update(){
			
			$query = "UPDATE users SET name = ? WHERE id = ?";
			$datas = array($name,$id);
			
			$result = $this->db_exec($query,$datas);
			
			// execute the query
			if($result->execute()){
				return true;
			}
			return false;
		}

3 - le fichier update_fruit.php qui est executee :
<?php
	// required headers
	header("Access-Control-Allow-Origin: *");
	header("Content-Type: application/json; charset=UTF-8");
	header("Access-Control-Allow-Methods: POST");
	header("Access-Control-Max-Age: 3600");
	header("Access-Control-Allow-Headers: Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With");
	 
	// include database and object files
	include_once '../config/dbase.php';
	include_once '../objects/tfruits.php';
	 
	// get database connection
	$database = new Database();
	 
	// prepare fruit object
	$fruit = new Fruit();
	 
	// get id of fruit to be edited
	$data = json_decode(file_get_contents("php://input"));
	 
	// set ID property of fruit to be edited
	$fruit->id = $data->id;
	 
	// set fruit property values
	$fruit->name = $data->name;
	 
	// update the fruit
	if($fruit->update()){
	 
		// set response code - 200 ok
		http_response_code(200);
	 
		// tell the user
		echo json_encode(array("message" => "fruit was updated."));
	}
	 
	// if unable to update the fruit, tell the user
	else{
	 
		// set response code - 503 service unavailable
		http_response_code(503);
	 
		// tell the user
		echo json_encode(array("message" => "Unable to update fruit."));
	}
?>


j'obtiens ces erreurs:

1 -
Notice: Trying to get property of non-object in ...\fruit\update_fruit.php on line 23
la ligne en question :
// set ID property of fruit to be edited
$fruit->id = $data->id;

2 -
Notice: Trying to get property of non-object in ...\fruit\update_fruit.php on line 26
la ligne en question :
// set fruit property values
$fruit->name = $data->name;

3 -
Notice: Undefined variable: name in ...\objects\tfruits.php on line 68
la ligne en question :
$datas = array($name,$id);
Commenter la réponse de lemega
Messages postés
24381
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
3 février 2019
359
0
Merci
les messages d'erreur ne parlent pas de ça...

Les messages d'erreurs indiquent que tu as un souci avec tes variables
$data->id; et $data->name;

Donc avec
$data = json_decode(file_get_contents("php://input"));

fais donc un var_dump de ta variable et regarde ce qu'elle contient.....

Ensuite (rien à voir avec ton message d'erreur..mais ça m'interpelle..).... Comment as tu pu passer de
function update(){
   
   // update query
   $query = "UPDATE " . $this->table_name . " SET name = ? WHERE id = ?";
   $datas = array($name,$id);
   
   db_exec($query,$datas);
   
   return false;
  }

A ça
// update the product
  function update(){
   
   $query = "UPDATE users SET name = ? WHERE id = ?";
   $datas = array($name,$id);
   
   $result = $this->db_exec($query,$datas);
   
   // execute the query
   if($result->execute()){
    return true;
   }
   return false;
  }


Le bon code, au passage, devant plutot être
function update(){
   
   // update query
   $query = "UPDATE " . $this->table_name . " SET name = ? WHERE id = ?";
   $datas = array($name,$id);
   return db_exec($query,$datas);
  }


mais bon..



Cordialement, 
Jordane                                                                 
Commenter la réponse de jordane45
Messages postés
84
Date d'inscription
mardi 13 janvier 2009
Dernière intervention
29 janvier 2019
0
Merci
Desolé,
c'etait du a la fatigue...
je l'ai fait pour les users
Commenter la réponse de lemega
Messages postés
84
Date d'inscription
mardi 13 janvier 2009
Dernière intervention
29 janvier 2019
0
Merci
Apres plusieurs essais, j'obtiens toujours le meme message d'erreurs.
Si c'est ce bout de code ci-dessous qui cause probleme, c'est là suis dans de beau drap
$data = json_decode(file_get_contents("php://input"));
Commenter la réponse de lemega
Messages postés
84
Date d'inscription
mardi 13 janvier 2009
Dernière intervention
29 janvier 2019
0
Merci
SVP, Au niveau du fichier update.php, quelle autre méthde pourrai-je utiliser, à l'emplacement de
$data = json_decode(file_get_contents("php://input"));
pour pouvoir obtenir les variables $data->id; et $data->name; ???
jordane45
Messages postés
24381
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
3 février 2019
359 -
Donc tu recois un array de plusieurs fruits ?
Et toi...tu ne boucles pas dessus... ?!
lemega
Messages postés
84
Date d'inscription
mardi 13 janvier 2009
Dernière intervention
29 janvier 2019
-
J'avoue que je ne vous suis pas bien quand vous parlez de boucle.
Ici, il s'agit de faire un update du fruit selectionné.
La boucle on l'a fait losqu'il s'agissait de lire les fruit(Affichage de tous les fruits).

J'adopte le systeme CRUD. Le R=read est déjà validée
Je suis entrain de traiter le U=Update.
jordane45
Messages postés
24381
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
3 février 2019
359 -
On recommence....

Tu récupères, lors de ton update, les données dans ta variable $data
$data = json_decode(file_get_contents("php://input"));

Que contient cette variable à ce moment ?

Si c'est le var_dump que tu m'as montré .. tu reçois un array contenant plusieurs "fruits".
Il faut donc boucler dessus...
lemega
Messages postés
84
Date d'inscription
mardi 13 janvier 2009
Dernière intervention
29 janvier 2019
-
Ahh ok, je vois...

donc qand j'applique le var_dump sur
$data = json_decode(file_get_contents("php://input"));
comme ceci
<?php

// include database and object files
	include_once '../config/dbase.php';
	include_once '../objects/tfruits.php';
	
	// get database connection
	$database = new Database();
	 
	// prepare fruit object
	$fruit = new Fruit();
	
// indiqué le chemin de votre fichier JSON, il peut s'agir d'une URL
$datas = json_decode(file_get_contents("php://input"));

var_dump(json_decode($datas));
?>
, je n'obtient rien Voici le resultat:
C:\wamp64\www\chatbot\fruit\vardump.php:16:null


La premiere fois je l'avais fait avec le fichier read_fruits.php en remplacant
php://input 
par
http://localhost/chatbot/fruit/read_fruits.php
jordane45
Messages postés
24381
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
3 février 2019
359 > lemega
Messages postés
84
Date d'inscription
mardi 13 janvier 2009
Dernière intervention
29 janvier 2019
-
Donc... soit tu n'envoies pas les données... soit y'a un souci..
As tu essayé avec le RAW ? Perso j'ai déjà eu le souci et j'ai été obligé de jouer avec les deux façons (d'où le code que je t'ai proposé)
$data = !empty(json_decode($HTTP_RAW_POST_DATA)) ? json_decode($HTTP_RAW_POST_DATA) 
Commenter la réponse de lemega

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.