2009-03-24 11 views
0

Ours avec moi, je suis un peu nouveau à tout cela,MYSQL erreur

J'ai cette requête en cours d'exécution dans mon script PHP:

$insertQuery = "INSERT INTO blog_articles 
    VALUES '$title', $tags', '$category', '$blog', '$author', '$date'"; 

Je cours alors ce script:

if ($result = $connector->query($insertQuery)){ 
    // It worked, give confirmation 
    echo '<center><b>Article added to the database</b></center><br>'; 
}else{ 
    // It hasn't worked so stop. Better error handling code would be good here! 
    die (mysql_error()); 
} 
} 

Je reçois cette erreur:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'Title Number 1, General, Blogging, Kayaking, General, Tgis is blog number spelli' at line 2

Mais je ne peux pas Quelle est l'erreur, il semble bien, donc si quelqu'un pouvait m'aider ce serait un grand merci

Répondre

4

Votre requête devrait être plus comme celui-ci

INSERT INTO blog_articles (`title`, `tags`, `category`, `blog`, `author`, `date`) 
VALUES ('$title', '$tags', '$category', '$blog', '$author', '$date') 

Vous devriez également regarder dans désinfectante votre requête. Peut-être cette façon (mais je ne sais pas votre configuration exacte, afin que les résultats peuvent varier)

$sql = sprintf("INSERT INTO blog_articles (`title`, `tags`, `category`, 
    `blog`, `author`, `date`) VALUES ('%s', '%s', '%s', '%s', '%s', '%s')", 
mysql_real_escape_string($title), mysql_real_escape_string($tags), 
mysql_real_escape_string($category), mysql_real_escape_string($blog), 
mysql_real_escape_string($author), mysql_real_escape_string($date)); 

Il utilise la fonction sprintf(), la documentation PHP a quelques bons exemples.

+0

Fonctionne parfaitement, pourriez-vous expliquer les références «% s» que je ne comprends pas? –

+0

% s signifie sortie de chaîne. – OIS

6

Vous avez une seule citation manquante avant $ tags.

0

Vous devez ajouter les noms des champs que vous insérez à

INSERT INTO blog_articles ('title', 'tags', 'category', 'blog', 'author', 'date') VALUES ('$title', '$tags', '$category', '$blog', '$author', '$date') 

Aussi, vous devez ajouter du code pour échapper Guillemet ou simple dans votre texte qui pourrait briser la requête SQL.

utiliser la fonction PHP mysql_real_escape_string()

mysql_real_escape_string() appelle la fonction bibliothèque de MySQL mysql_real_escape_string, qui ajoute un slash aux caractères suivants: \ x00, \ n, \ r, \, »," et \ X1A.

pour plus de détails:. http://uk.php.net/mysql_real_escape_string

+0

Vous n'avez pas vraiment besoin de spécifier les champs que vous insérez dans MySQL, bien que ce soit une bonne idée. Aussi, si vous citez vos champs, il devrait être avec des guillemets pas des guillemets simples –

0

Comme aknock dit, il vous manque un avant $ tags

, vous avez vraiment besoin cependant d'être en utilisant mysql_escape_string pour se protéger contre SQL injection attaques. L'utilisation de mysql_escape_string pour vos paramètres de requête SQL est une bonne habitude à prendre en compte. L'utilisation d'un wrapper DB comme PEAR peut rendre les paramètres d'échappement beaucoup moins douloureux. Votre code ci-dessus pourrait être écrit comme:

$insertQuery = "INSERT INTO blog_articles \ 
        (`title`, `tags`, `category`, `blog`, `author`, `date`) \ 
        VALUES (?, ?, ?, ?, ?, ?)"; 

$data = array($title, $tags, $category, $blog, $author, $date); 

if ($result = $connector->query($insertQuery, $data)) { 
    // It worked, give confirmation 
    echo '<center><b>Article added to the database</b></center><br>'; 
}else{ 
    // It hasn't worked so stop. Better error handling code would be good here! 
    die (mysql_error()); 
} 

(en supposant $connector est un objet PEAR DB)

donnant Explicitement les noms et l'ordre des colonnes que vous insérez fait votre code beaucoup plus maintenable et lisible . Si vous modifiez le schéma de la base de données ultérieurement, vous serez protégé contre l'insertion de valeurs dans la mauvaise colonne ou dans des colonnes qui n'existent plus.