SQLSTATE[42000]: erreur de Syntaxe ou de violation d'accès: 1064

Je suis en train d'écrire un logiciel maintenant. Reader's digest version: aux utilisateurs de sélectionner un package, entrer leur nom, prénom, email, et désiré sous-domaine. Sous-domaine est alors vérifié pour voir si quelqu'un a déjà enregistré, et si elle n'est alphanumérique. J'ai eu l'ensemble de ce travail à l'aide OO mysqli, mais j'ai décidé de passer à PDO.

Libellé Exact de l'erreur:

SQLSTATE[42000]: erreur de Syntaxe ou de violation d'accès: 1064 Vous avez une erreur dans votre syntaxe SQL; consultez le manuel qui correspond à votre versions du serveur MySQL pour la bonne syntaxe à utiliser près de "- >sous-domaine' à la ligne 1

Quand j'arrive à l'instanciation de mon objet Admin, tout est bien. Cependant, lorsque j'appelle la createAccount() fonction, tout l'enfer se déchaîne. La trace de la pile est tous sur la place, et j'ai peine à comprendre quand commencer la résolution de ce. J'ai vérifié les autres réponses ici, et ils ont tous l'air trop localisée, donc voici le code qui le produit, puis toutes les méthodes qui contiennent des erreurs. Nous y voilà....

Tout d'abord, le code qui génère l'erreur:

include 'classes/Admin.class.php';
$admin = new Admin('[email protected]');

try {
    $admin->createAccount('John', 'Smith', 'test', 'pro');
}
catch(Exception $e) {
    echo '<pre />';
    echo $e->getMessage();
    die(print_r($e->getTrace()));
}

Admin Constructeur De La Classe De

public function __construct($email) {
        $this->email = $email;

        include 'Database.class.php';
        include 'PasswordHash.php';

        define("DB_HOST", "localhost");
        define("DB_USER", "root");
        define("DB_PASS", "");
        define("DB_NAME", "ems");

        $this->data = new Database;
        $this->hasher = new PasswordHash(8, false);
    }

À l'intérieur de l'Admin de la classe,de la vérification de la sous-domaine

private function checkSubdomain() {
    $this->data->query('SELECT * FROM clients WHERE subdomain = :subdomain');
    $this->data->bind(':subdomain', $this->subdomain);
    $this->data->execute();

    return ($this->data->rowCount() == 0) && (ctype_alnum($this->subdomain));
}

De la classe PDO exécuter, de lier, de requête et de

public function execute() {
    return $this->stmt->execute();
}

public function query($query) {
    $this->stmt = $this->dbh->prepare($query);
}

public function bind($param, $value, $type = null) {
    if(is_null($type)) {
        switch(true) {
            case is_int($value):
                $type = PDO::PARAM_INT;
                break;
            case is_bool($value):
                $type = PDO::PARAM_BOOL;
                break;
            case is_null($value):
                $type = PDO::PARAM_NULL;
            default:
                $type = PDO::PARAM_STR;
        }
    }
    $this->stmt->bindValue($param, $value, $type);
}

Cette erreur est répandue à travers mon code, donc je pense que c'est seulement dans la classe PDO, mais ma Séance de classe a très bien fonctionné. Aussi, mes requêtes a parfaitement fonctionné en utilisant uniquement mysqli, donc je suis confiant dans ma syntaxe. Toute aide est grandement appréciée.

Par la demande, l'créez compte de la fonction:

public function createAccount($firstname, $lastname, $subdomain, $package)
{
    $this->firstname = $firstname;
    $this->lastname  = $lastname;
    $this->subdomain = $subdomain;
    $this->package   = $package;
    //does the subdomain exist, or is it invalid?
    if(!$this->checkSubdomain())
        throw new Exception('This domain is not available. It can only contain letters and numbers and must not already be taken.');

    //now comes the table creation, provided everything is in order
    $this->setup();
}

Voici la configuration de la fonction qui est appelée par createAccount (sans toutes les structures de la table):

private function setup() {
    $isError = false;
    $queries = array(
        //all of these are CREATE statements, removed for security reasons
        );

    //need a database that matches with the client subdomain
    $this->data->query('CREATE TABLE $this->subdomain');
    $this->data->bind(':subdomain', $this->subdomain);

    //PDO secured...execute
    $this->data->execute();

    $this->data->beginTransaction();
    foreach($queries as $query) {
        $this->data->query($query);
        if(!$this->data->execute()) { //we hit some sort of error, time to GTFO of here
            $isError = true;
            $this->data->cancelTransaction();
            //die('Error with: ' . $query);
            break;
        }
    }

    if(!$isError) {
        $this->data->endTransaction();
        mkdir('a/' . $this->subdomain, 0755);
        $this->generatePass();
        //this is where I insert the user into the admin table using PDO, removed for security
        $this->data->execute();
    }

    $this->data->close();

}
  • Vous aurez besoin de localiser exactement la ligne qui provoque cette erreur. Le message d'erreur est directe à partir de la base de données MySQL SGBD, et une partie de votre code PHP ->subdomain est concaténées dans une requête quelque part. Le code que vous avez posté ci-dessus n'a pas l'air capable de produire une erreur comme ça, depuis que vous êtes correctement appelant bindValue()
  • Commencez par regarder (et d'écriture) à l' createAccount() fonction.
  • Posté le createAccount() et setup() les fonctions. J'ai enlevé le tableau des structures pour la sécurité. Laissez-moi savoir si vous avez besoin d'une instruction SQL spécifique et nous pouvons aller à partir de là.
  • $this->data->query('CREATE TABLE $this->subdomain'); - vous besoin pour échapper à la variable à l'intérieur de votre SQL.
  • Oups! Grâce andrewsi. Vous voyez, la ligne suivante est bon, mais j'ai eu un petit mentale lapse où il aurait dû être :sous-domaine au lieu de $this->sous-domaine.
  • Sauf que vous n'allez pas être en mesure de lier :subdomain dans ce CREATE TABLE contexte. PDO n'a pas permis de paramètres contraignants que les noms de table. Vous aurez besoin de concaténer dans " comme il vous a tenté, mais l'enfermer comme CREATE TABLE `{$this->subdomain}` et de le faire seulement après avoir validé contre les injections SQL
  • $this->sous-domaine = $this->mysqli->real_escape_string($this->sous-domaine); $this->données>query('CREATE TABLE $this->subdomain'); a Fait le tour. Comment puis-je utiliser PDO pour basculer entre les deux? Dois-je instancier un nouvel objet de Base de données, ou dois-je utiliser la db.table de syntaxe?

InformationsquelleAutor brokekidweb | 2013-09-24