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

lemega Messages postés 87 Date d'inscription mardi 13 janvier 2009 Statut Membre Dernière intervention 31 mai 2023 - 25 janv. 2019 à 11:26
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 - 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
A voir également:

7 réponses

jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 344
Modifié le 25 janv. 2019 à 12:10
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 !








0
lemega Messages postés 87 Date d'inscription mardi 13 janvier 2009 Statut Membre Dernière intervention 31 mai 2023 1
25 janv. 2019 à 12:03
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.
0
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 344 > lemega Messages postés 87 Date d'inscription mardi 13 janvier 2009 Statut Membre Dernière intervention 31 mai 2023
Modifié le 25 janv. 2019 à 12:10
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);
0
lemega Messages postés 87 Date d'inscription mardi 13 janvier 2009 Statut Membre Dernière intervention 31 mai 2023 1
25 janv. 2019 à 15:00
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;
		}
0
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 344
25 janv. 2019 à 16:26
Oui c'est ça
0
lemega Messages postés 87 Date d'inscription mardi 13 janvier 2009 Statut Membre Dernière intervention 31 mai 2023 1
26 janv. 2019 à 04:11
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);
0
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 344
Modifié le 26 janv. 2019 à 06:53
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..



0

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

Posez votre question
lemega Messages postés 87 Date d'inscription mardi 13 janvier 2009 Statut Membre Dernière intervention 31 mai 2023 1
26 janv. 2019 à 23:31
Desolé,
c'etait du a la fatigue...
je l'ai fait pour les users
0
lemega Messages postés 87 Date d'inscription mardi 13 janvier 2009 Statut Membre Dernière intervention 31 mai 2023 1
28 janv. 2019 à 09:45
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"));
0
lemega Messages postés 87 Date d'inscription mardi 13 janvier 2009 Statut Membre Dernière intervention 31 mai 2023 1
28 janv. 2019 à 11:53
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; ???
0
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 344
28 janv. 2019 à 12:38
Je t'ai indiqué dans ma précédente réponse

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

L'as tu fais ? ça donne quoi ??

Sinon, pour récupérer les données envoyées à ton WebService.. teste ça
$data = !empty(json_decode($HTTP_RAW_POST_DATA)) ? json_decode($HTTP_RAW_POST_DATA) :  json_decode(file_get_contents('php://input'));
0
lemega Messages postés 87 Date d'inscription mardi 13 janvier 2009 Statut Membre Dernière intervention 31 mai 2023 1
29 janv. 2019 à 01:13
Voici ce que donne le var_dump:
C:\wamp64\www\chatbot\fruit\vardump.php:5:
object(stdClass)[5]
  public 'records' => 
    array (size=4)
      0 => 
        object(stdClass)[1]
          public 'id' => string '1' (length=1)
          public '0' => string '1' (length=1)
          public 'name' => string 'Banane' (length=6)
          public '1' => string 'Banane' (length=6)
      1 => 
        object(stdClass)[2]
          public 'id' => string '2' (length=1)
          public '0' => string '2' (length=1)
          public 'name' => string 'carotte' (length=7)
          public '1' => string 'carotte' (length=7)
      2 => 
        object(stdClass)[3]
          public 'id' => string '3' (length=1)
          public '0' => string '3' (length=1)
          public 'name' => string 'tomate' (length=6)
          public '1' => string 'tomate' (length=6)
      3 => 
        object(stdClass)[4]
          public 'id' => string '4' (length=1)
          public '0' => string '4' (length=1)
          public 'name' => string 'poireau' (length=7)
          public '1' => string 'poireau' (length=7)


Aussi je pense la variable
$HTTP_RAW_POST_DATA
est obsolète. C'est pour quoi j'ai utilisé
php://input


NB: j'utiise php7.1.26
0
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 344
29 janv. 2019 à 06:53
Donc tu recois un array de plusieurs fruits ?
Et toi...tu ne boucles pas dessus... ?!
0
lemega Messages postés 87 Date d'inscription mardi 13 janvier 2009 Statut Membre Dernière intervention 31 mai 2023 1
Modifié le 29 janv. 2019 à 12:36
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.
0
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 344
29 janv. 2019 à 14:04
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...
0
Rejoignez-nous