Ceci est mon code. Je crois que cela ne lie pas la valeur aux paramètres. Mais je ne sais pas pourquoi:

public function create($fields)
    {
        $keys = array_keys($fields);
        $values = null;
        $x = 1;

        foreach($fields as $field) {
            $values .= '?';
            if ($x < count($fields)) {
                $values .= ', ';
            }
            $x++;
        }

        $sql = "INSERT INTO users (`" . implode('`, `', $keys) . "`) VALUES ({$values})";

        if(!$this->db->prepare($sql)->execute($fields)) {
            return true;
        }
        return false;
    }

Et sur index.php:

$user = new User();
$user->create(array(
                'name' => 'test',
                'username' => 'test2',
                'email' => 'test@gmail.com'
            ));

Pourquoi mes valeurs ne sont-elles pas liées aux paramètres? Voici l'erreur complète:

Une exception s'est produite lors de l'exécution de 'INSERT INTO users (name, username, email) VALUES (?,?,?) 'Avec les paramètres ["test", "test2", "test@gmail.com"]:

SQLSTATE [HY093]: Numéro de paramètre non valide: le paramètre n'a pas été défini

0
user7758063 2 avril 2017 à 20:11

2 réponses

Meilleure réponse

Si vous utilisez la méthode ? pour votre requête, le tableau que vous envoyez dans les paramètres pourrait ne pas avoir de clés je pense!

EDIT: faites execute(array_values($fields)) , vous devez utiliser les clés quand il y a des paramètres comme username = :username, pass = :pass etc

0
Florent Banneux 2 avril 2017 à 17:38

Essaye ça


    public function create($fields)
        {
            $keys ='';
            $values = '';
            foreach($fields as $k=>$field) {
                $keys[] = $k;
                $values[] = $field;
            }
            $sql = "INSERT INTO users (".implode(',',$keys).") VALUES ("'".implode ("','",$values)."'")";
            if(!$this->db->prepare($sql)->execute($fields)) {
                return true;
            }
            return false;
        }

0
Bhautik Radiya 2 avril 2017 à 17:45