[RESOLU] Variable en field qui ne fonctionne pas

Petit nouveau ! | 5 Messages

17 févr. 2021, 10:12

Bonjour a tous,

Je n'arrive pas à injecter des données dans ma base SQL avec une variable $field qui retourne la valeur de la colonne.
Je dois faire une erreur quelque part mais je ne trouve pas.
Merci d'avance pour votre aide.

Voici mon code :
    <form method="post" action="/admin/ajouter.php">
        <input id="radio1" name="user_type" value="A" type="radio">
        <label for="radio1">A</label>
        <input id="radio2" name="user_type" value="B" type="radio">
        <label for="radio2">B</label>
        <input id="radio3" name="user_type" value="C" type="radio">
        <label for="radio3">B</label>
        <input id="radio4" name="user_type" value="D" type="radio">
        <label for="radio4">C</label><br>  
                  

        <input type="email" name="email" placeholder="Adresse e-mail"/><br>
        <input type="password" name="password" placeholder="Mot de passe"><br>

        <input type="submit" value="Connexion">
    </form>
Et puis aussi :
<?php
    function secureArray($array_sec) {
        foreach($array_sec as $key => $value) {
            if (is_array($value)) {
                $array_sec[$key] = secureArray($value);
            } else {
                $array_sec[$key] = htmlentities($value, ENT_QUOTES);
            }
        }
        return $array_sec;
    }
    
    $sPOST=secureArray($_POST);

    try
    {
    	$bdd = new PDO('mysql:host=localhost;dbname=bddlib;charset=utf8', 'root', 'root');
    }
    catch(Exception $e)
    {
            die('Erreur : '.$e->getMessage());
    }    

    $email=$sPOST['email'];

    if (isset($email)) {
        $req = $bdd->prepare('INSERT INTO lib_user(email) VALUES(:val1)');
        $req->execute(array(
        'val1' => $email
    ));
    }

    if(isset($sPOST) && is_array($sPOST)) {
        $req = $bdd->prepare('UPDATE lib_user SET $field = :val1 WHERE email = :email');
        $liste_user = $sPOST;
        foreach($liste_user as $field => $data) {
           echo $field .' => '. $data .'<br/>';
           $req->execute(array( 'val1' => $data,
                                'email' => $email));
        }
    }       
    ?>
Je suis preneur de toute info aussi sur les mauvaises pratiques que je fais.
Je suis débutant.

Merci encore pour votre aide.

Petit nouveau ! | 5 Messages

17 févr. 2021, 11:03

Personne pour m'aider ?

Avatar du membre
Mammouth du PHP | 1609 Messages

17 févr. 2021, 12:21

Salut, la comme ça y a pas d'erreur qui me saute aux yeux. Utilises var_dump pour voir le contenu de tes variables au fur et à mesure de l'exécution du script, ça devrait t'aider à trouver l'origine du problème.
La au feeling je dirais que ça vient des requêtes car tu n'en testes pas les résultats.
Je trouve pas très logique de faire une boucle d'update non plus mais pourquoi pas.
Développeur web depuis + de 20 ans

Petit nouveau ! | 5 Messages

17 févr. 2021, 12:44

Merci pour ton retour Saian.

J'ai utilisé var_dump comme tu me le conseil et cela m'indique que $field est string(9) "user_type".

Voici ma base mysql :

Code : Tout sélectionner

# Name Type Collation Null Default 1 idPrimary int(11) No None AUTO_INCREMENT 2 email varchar(255) utf8_general_ci No None 3 user_type varchar(10) utf8_general_ci Yes NULL


J'ai décidé de passer par un UPDATE (parce que je ne sais pas faire autrement :oops: ).
En fait j'ai un FORM avec beaucoup de input qui sont en CHECKBOX.
Je vais donc avoir beaucoup d'information à envoyer dans ma base mais comme je ne sais pas d'avance lesquels vont être sélectionné je veux passer par leUPDATE.

J'ai bien dans ma variable $field la valeur user_type et dans ma base sql aussi, je ne comprend pas qu'il ne met pas à jour la valeur.

Avatar du membre
Mammouth du PHP | 1609 Messages

17 févr. 2021, 12:58

Ce que je voulais dire à propos de l'update, c'est qu'il me semble si j'ai bien interprété le code, que tu fais un update par colonne alors que tu pourrais faire un seul update pour toutes les colonnes. ;)

Si les valeurs des variables sont correctes alors je pense que tu as probablement une erreur avec les requêtes. Tu peux tester le retour de execute et si ça retourne false afficher l'erreur à l'aide de errorInfo.

https://www.php.net/manual/fr/pdostatem ... orinfo.php

PS : si j'ai bien lu le code aussi il me semble que tu injectes dans la requête le nom de la colonne à partir du nom de l'input. C'est délicat car un utilisateur mal intentionné pourrait théoriquement exploiter cela.
Développeur web depuis + de 20 ans

Petit nouveau ! | 5 Messages

17 févr. 2021, 13:21

J'ai ca comme reponse :
PDOStatement::errorInfo():
Array ( [0] => 42S22 [1] => 1054 [2] => Unknown column '$field' in 'field list' )

Mammouth du PHP | 2703 Messages

17 févr. 2021, 13:59

$sql = 'UPDATE lib_user SET $field = :val1 WHERE email = :email';
echo $sql;
$req = $bdd->prepare($sql);

est-ce que cela affiche ce qui est attendu ?

Petit nouveau ! | 5 Messages

17 févr. 2021, 14:50

Merci pour votre aide. =D> =D> =D> =D>

Voici la réponse :
$sql = 'UPDATE lib_user SET ' . $field . ' = :val1 WHERE email = :email';
$req = $bdd ->prepare($sql);