8768 sujets

Développement web côté serveur, CMS

Pages :
Bonjour à tous, voilà, j'ai une requête DELETE à faire, et qql conditions pour que celle-ci soit effectuée... seulement il me pond toujours cette erreur :

( ! ) Warning: PDOStatement::execute() expects parameter 1 to be array, string given in C:\wamp\www\Projets.php on line 210

voici la requête :

if(isset($_POST['supprimer']) && !empty($_POST['nom_ref_cache'])){
$essai = $_POST['nom_ref_cache'];
$req = $pdo->prepare("DELETE FROM projets LEFT JOIN utilisateurs_particuliers ON projets.ID_utilisateur = utilisateurs_particuliers.id WHERE reference = '$essai' LIMIT 1");
$req->execute($essai);
}

le "nom_ref_cache" est une chaine de caractère récupéré dans un input hidden, suite a un clique sur une ligne. Je vérifie que le champs ne soit pas vide, et que ça supprime bien la ligne où le champs récupéré correspond au même que celui dans la BBD, et que cette chaine de caractère correspond bien a cet utilisateur... Le code parle mieux que ça Smiley lol

Vous auriez une idée d'où cela peut-il venir? La requête normalement non, car je l'ai testé directement sur MySQL...

Merci de votre aide !
Salut,
as-tu simplement essayé quelque chose du genre execute(array($essai)), puisque c'est ce que réclame explicitement le message d'erreur ?
(j'y connais rien en POO et j'ai même du mal à comprendre pourquoi $essai est passé dans execute, si tu veux bien m'expliquer j'suis preneur ^^)
Bonjour, oui je l'ai fait... Smiley ohwell et il me met une Fatal error, et une PDO Exception a ma ligne d'execution... rien a en tirer de cet execute() xD

J'ai juste remplacé le champ récupéré par une variable lambda (ici $essai) pour voir si c'est pas éventuellement moi qui faisait une bourde dans l'écriture entre les parenthèses de l'execute()
^^

un truc qui peu éclaircir c'est que ma variable dans le champ hidden change selon la ligne d'un tableau cliqué, et à chaque fois que je clique une autre ligne, la variable change (j'ai fait l'essai en laissant l'input visible). J'ai voulu vérifié si toute fois il ne gardait pas la valeur de la ligne précédente, mais non, elle est bien remplacé ... Smiley ohwell

EDIT : le var_dump prend en compte le bouton supprimer...

C:\wamp\www\Suppression.php:4:
array (size=2)
'nom_ref_cache' => string 'z' (length=1)
'supprimer' => string 'Supprimer' (length=9)

Le form et l'input type submit pour supprimer on un name="supprimer"

Cela cible bien le bon formulaire (j'en ai un autre dans la page)

RE EDIT :
if(!empty($_POST['supprimer'])){
var_dump($_POST['supprimer']);
$req = $pdo->prepare("DELETE FROM projets JOIN utilisateurs_particuliers ON projets.ID_utilisateur = utilisateurs_particuliers.id WHERE reference = ?");
$req->execute($_POST['nom_ref_cache']);
header('Location: Mon_compte.php');
}

La redirection a bien lieux, mais la requête n'est pas exécuté..

et le var_dump :
C:\wamp\www\Projets.php:206:string 'Supprimer' (length=9)

Il doit prendre en compte la submit...et je ne sait pas pourquoi...Vous auriez une idée?
Modifié par melER5 (15 Apr 2020 - 07:43)
Le form et l'input type submit pour supprimer on un name="supprimer"


tu veux dire que le form et l'input ont le même name ? c'est peut-être ça qui gêne


sinon essaie :


if(isset($_POST['supprimer']) && !empty($_POST['nom_ref_cache'])){
$essai = $_POST['nom_ref_cache'];
$req = $pdo->prepare("DELETE FROM projets LEFT JOIN utilisateurs_particuliers ON projets.ID_utilisateur = utilisateurs_particuliers.id WHERE reference = ? LIMIT 1");
$req->execute(array($essai));
}

pour voir ?
Salut !

Look cette doc : https://www.php.net/manual/fr/pdostatement.execute.php

Pour moi, faudrait que tu formates comme ça :


if (isset($_POST['supprimer']) && !empty($_POST['nom_ref_cache'])) {

    // Ici c'est un string, il sera passé au tableau de binding
    $essai = $_POST['nom_ref_cache'];
    $req = $pdo->prepare("
        DELETE FROM projets 
        LEFT JOIN utilisateurs_particuliers 
            ON projets.ID_utilisateur = utilisateurs_particuliers.id 
        WHERE reference = :essai 
        LIMIT 1
    ");

    // Tu lui passes ta valeur, bindée sur :essai
    // Elle sera automatique échapée
    $req->execute([':essai' => $essai]);
}

Modifié par Wazazaby (16 Apr 2020 - 12:18)
Bonjour ! Merci pour votre aide !

Malheureusement ça change rien...Ni dans un cas, ni dans l'autre...
J'ai enlevé le name au form, pareil..
Quand je fais le var_dump, il ne me l'affiche même pas alors que j'ai pas mis la redirection Smiley ohwell
ça doit quand-même pas être si compliqué de supprimer une ligne d'une table ? XD
Tu as quoi comme message d'erreur ?

Aussi dans ton SQL faut spécifier à quelle table appartient "reference" comme ceci :
WHERE projets.reference = :essai
ou
WHERE utilisateurs_particuliers.reference = :essai

Edit :
Aussi le LIMIT 1 à la fin je crois pas qu'il soit bon, comme tu fais un DELETE sur un JOIN, ça devrait te supprimer 2 lignes (une dans chaque table)
Modifié par Wazazaby (16 Apr 2020 - 13:52)
J'ai modifier cela aussi, ça ne fonctionne pas non plus... Smiley ohwell
Merci de votre aide !
J'ai fait une capture de ce qu'il me sort en erreur :
upload/1587038375-78878-sanstitre.png

c'est cette ligne-là :
    $req->execute([':essai' => $essai]);

Modifié par melER5 (16 Apr 2020 - 14:00)
OK il te lance une exception.

Est ce que tu peux entourer la ligne dans un bloc try / catch comme ceci stp (et poster le contenu du var_dump) :


try {
    $req->execute([':essai' => $essai]);
} catch (PDOException $e) {
    var_dump($e->getMessage());
}


Quelle version de PHP utilises-tu ?
Modifié par Wazazaby (16 Apr 2020 - 14:06)
Fait, il me retourne ça :

C:\wamp\www\Projets.php:217:string 'Supprimer' (length=9)
C:\wamp\www\Projets.php:233:string 'SQLSTATE[42000]: Syntax error or access violation: 1064 Erreur de syntaxe pr?s de 'LEFT JOIN utilisateurs_particuliers
ON projets.ID_utilisateur = ut' ? la ligne 2' (length=177)

J'utilise la 7.2.18, avec wamp
Donc c'est une erreur de SQL...

Est ce que tu peux tester cette requete (un simple SELECT) pour voir si ça marche ? :

SELECT * FROM projets
LEFT JOIN utilisateurs_particuliers ON projets.ID_utilisateur = utilisateurs_particuliers.id
WHERE projets.reference = "La valeur de $essai"

La colonne "reference" se trouve bien dans "projets" ?
Modifié par Wazazaby (16 Apr 2020 - 15:41)
Oui elle se trouve bien dans projets, aussi dans stocks, mais je sais viser précisément ce que je veux, ça m'a fait le coup avec "id is ambigue"
Je vais essayer

c'est un id $essai Smiley smile

EDIT : ça marche correctement

sinon en mettant delete a la place j'obtient ça :

C:\wamp\www\Projets.php:217:string 'Supprimer' (length=9)
C:\wamp\www\Projets.php:232:string 'SQLSTATE[42000]: Syntax error or access violation: 1064 Erreur de syntaxe pr?s de 'LEFT JOIN utilisateurs_particuliers ON projets.ID_utilisateur = utilisateurs_par' ? la ligne 2' (length=177)

la même chose il me semble
Modifié par melER5 (16 Apr 2020 - 14:40)
sinon, en faisant :
if (isset($_POST['supprimer']) && !empty($_POST['id_reference_cache'])) {
var_dump($_POST['supprimer']);
    // Ici c'est un string, il sera passé au tableau de binding

    $req = $pdo->prepare("
        DELETE FROM projets
LEFT JOIN utilisateurs_particuliers ON projets.ID_utilisateur = utilisateurs_particuliers.id
WHERE projets.reference = ?
    ");

    // Tu lui passes ta valeur, bindée sur :essai
    // Elle sera automatique échapée
try {
    $req->execute($_POST['id_reference_cache']);
} catch (PDOException $e) {
    var_dump($e->getMessage());
}
}


j'ai :

upload/1587041063-78878-sanstitre.png
OK donc il aime pas le LEFT JOIN on dirait, pourtant j'ai rien trouvé qui interdit de faire un LEFT JOIN dans un DELETE (je crois que dans certaines versions de PostgreSQL c'est pas possible).

Essaye comme ça :

if (isset($_POST['supprimer']) && !empty($_POST['nom_ref_cache'])) {
    $essai = $_POST['nom_ref_cache'];
    $req = $pdo->prepare("
        DELETE FROM projets 
        INNER JOIN utilisateurs_particuliers 
            ON projets.ID_utilisateur = utilisateurs_particuliers.id 
        WHERE projets.reference = :essai
    ");

    try {
        // Ici je passe un array, avec en clé ':essai' et en value $essai
        $req->execute([':essai' => $essai]);
    } catch (PDOException $e) {
        var_dump($e->getMessage());
    }
}


EDIT :
Oui c'est normal, tu lui passes un int/string alors que la méthode execute attend un array en paramètre
Modifié par Wazazaby (16 Apr 2020 - 14:49)
Oui, ben il n'aime pas l'INNER JOIN non plus on dirait Smiley lol
du coup il n'y a pas moyen de faire autrement?

Merci de ton aide en tout cas !
oui
$pdo = new PDO('mysql:host=127.0.0.1;dbname=db_site_web', 'root', '');
	$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
	$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);


PS : J'ai une requete sur un autre truc, avec un SELECT, il me dit champs inconnu dans WHERE clause, je la teste direct sur MySQL, ça marche...

EDIT : Pour la deuxième erreur c'est ma faute, une virgule en moins Smiley lol
Modifié par melER5 (16 Apr 2020 - 15:33)
Bonne nouvelle !
Testes ça :


if (isset($_POST['supprimer']) && !empty($_POST['nom_ref_cache'])) {
    $essai = $_POST['nom_ref_cache'];
    $req = $pdo->prepare("
        DELETE projets, utilisateurs_particuliers 
        FROM projets 
        LEFT JOIN utilisateurs_particuliers 
            ON projets.ID_utilisateur = utilisateurs_particuliers.id 
        WHERE projets.reference = :essai
    ");

    try {
        $req->execute([':essai' => $essai]);
        var_dump($req);
    } catch (PDOException $e) {
        var_dump($e->getMessage());
    }
}


J'ai setup une BDD en local avec quelques entrées et une liaison, et avec ce code ça marche Smiley smile
Le var_dump() devrait t'afficher true, et ta ligne sera supprimée (enfin tes lignes du coup)
Modifié par Wazazaby (16 Apr 2020 - 15:37)
Je l'ai testé ça me retourne ça :
C:\wamp\www\Projets.php:229:
object(PDOStatement)[4]
public 'queryString' => string '
        DELETE projets, utilisateurs_particuliers 
        FROM projets 
        LEFT JOIN utilisateurs_particuliers 
            ON projets.ID_utilisateur = utilisateurs_particuliers.id 
        WHERE projets.reference = :essai
    ' (length=240)


je l'ai faite en BDD et affectivement ça marche, mais ça a supprimé aussi l'utilisateur, en fait le but étant de supprimer le projet choisis par l'utilisateur parmi les siens Smiley lol
Pages :