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:
// 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] => )
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 !
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 !
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);
ç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
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
Vous n’avez pas trouvé la réponse que vous recherchez ?
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
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.
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é)
25 janv. 2019 à 12:03
Vous avez parfaitement raison.
Au fait, cet API je l'ai fait sur MySQL et marche parfaitement.
Maintenant je veux utiliser SQL SERVER.
Modifié le 25 janv. 2019 à 12:10
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 :
est à remplacer par :