2010-11-24 12 views
1

J'ai le code suivant:php mysql_query ne retourne rien après insertion (et rien est inséré soit)

<?php 
    if(!empty($error_msg)) 
    print("$error_msg"); 
    else 
    { 
    require_once("../include/db.php"); 

    $link = mysql_connect($host,$user,$pass); 
    if (!$link) 
    print('Could not connect: ' . mysql_error()); 
    else 
    {  
    $sql = "insert into languages values(NULL,'$_POST[language]','$_POST[country_code]');"; 
    $res = mysql_query($sql); 

    print("$sql<br>\n"); 
    print_r("RES: $res"); 
    mysql_close($link); 
    } 
    } 
?> 

En un mot: il ne fonctionne pas. mysql_query ne retourne rien. Si j'essaie la même requête dans php_myadmin, cela fonctionne. Il n'insère rien non plus. Aussi essayé comme utilisateur root, rien non plus. Je n'ai jamais eu ça avant. En utilisant mysql 5.1 et PHP 5.2.

Des idées?

+0

echo $ sql, et affichez ici les résultats .. –

+3

'Always' définir les colonnes que vous insérez. La façon dont il est configuré maintenant si votre structure change votre requête va casser. Ne faites pas plus de travail pour vous-même sur la route. – Webnet

+0

il y a probablement une erreur dans votre requête .. –

Répondre

4

mysql_query retournera un booléen pour les requêtes INSERT. Si vous var_dump$res vous devriez voir une valeur booléenne en cours d'impression. Il retournera TRUE pour une requête réussie, ou FALSE si une erreur survient. En aucun cas, il retourne jamais NULL.

En outre, ne passe jamais les données d'entrée (par exemple: $ _POST) directement à une requête SQL. Ceci est une recette pour l'injection SQL. Utilisez mysql_real_escape_string sur ce premier:

$language = mysql_real_escape_string($_POST['language']); 
$sql = "INSERT INTO language SET language='$language'"; 

Et ne pas oublier de citer vos indices de tableau (par exemple .: $_POST['language'] au lieu de $_POST[language]) pour éviter les erreurs E_NOTICE.

+0

Il n'y aura pas d'avertissement pour l'index de tableau sans guillemets dans les chaînes. http://php.net/manual/en/language.types.string.php#language.types.string.parsing.simple – acm

+0

@andre: Vous avez raison. Je le mentionnais en fait parce que je l'ai utilisé des citations hors ligne. Cependant, je pense que vous feriez mieux de le citer par souci de cohérence. – netcoder

0

-I retirer le commentaire de citation, mais toujours pas bon d'insérer directement les valeurs $ _POST .--

Deuxièmement, je ne pense pas que je l'ai vu print_r assez utilisé comme ça, essayez l'aide d'un écho.

Et mysql_query est seulement attendu un retour booléen sur un INSERT, qu'attendez-vous?

+0

La chaîne entière est une chaîne entre guillemets, cela ne posera donc aucun problème. Les guillemets simples sont des caractères littéraux à PHP. – Hammerite

+0

false en tant que chaîne vide – mooizo

+0

corrigé avec var_dump. – mooizo

3

Vous devez spécifier une base de données pour que le système sait quelle base de données pour exécuter la requête sur ...

http://php.net/manual/en/function.mysql-select-db.php

Sans sélectionner une base de données, vos données ne seront pas insérés

+0

C'est marrant, c'est simple et vrai. – Lekensteyn

+0

+1 Je pense que nous avons tous manqué celui-là. Bon appel. Juste une note, ce n'est pas obligatoire. Une requête comme 'INSERT INTO database.languages' fonctionnerait aussi (quelque chose que OP n'a pas fait). – netcoder

+0

Si l'identificateur de lien n'est pas spécifié, le dernier lien ouvert par mysql_connect() est supposé – mooizo

1

Avec une INSERT requête, mysql_query renvoie true ou false selon que la requête a réussi ou non. Ici, il est très probable que cela retourne faux. Changer la ligne print_r("RES: $res"); à print_r("RES: ".(int)$res); et le plus probable, vous le verrez imprimer RES: 0.

Le problème peut être que MySQL attend une liste de noms de colonnes avant le mot-clé VALUES.

En outre, vous semblez insérer des variables POST directement dans SQL - vous devriez lire sur l'injection SQL pour voir pourquoi c'est une mauvaise idée. Mysql_query renvoie un booléen pour les requêtes INSERT.

+0

+1 bien que je préfère var_dump à (int) cast car var_dump vous montre exactement ce que c'est. –

2

S'il est utilisé dans un contexte de chaîne, tel que echo "$res", true sera affiché comme 1 et false comme une chaîne vide. Une erreur de requête s'est peut-être produite. Utilisez mysql_error() pour savoir pourquoi la requête a échoué.

$sql = "insert into languages values(NULL,'$_POST[language]','$_POST[country_code]');"; 

Ceci est très mauvaise pratique, un utilisateur malveillant peut envoyer des messages à votre serveur artisanaux (voir SQL Injection).

Vous devriez au moins échapper à l'entrée. En supposant que vos noms de colonnes sont nommés « langue » et « country_code », c'est un meilleur remplacement pour le code ci-dessus:

$sql = sprintf('INSERT INTO LANGUAGES (language, country_code) VALUES ("%s","%s")', 
    mysql_real_escape_string($_POST['language']), 
    mysql_real_escape_string($_POST['country_code']) 
    ); 

Pour une description de la fonction mysql_real_escape_string, voir le PHP Manual. Pour les débutants et les programmeurs expérimentés, c'est toujours la meilleure ressource pour obtenir des informations sur les fonctions PHP. Au lieu d'utiliser directement $_POST, je suggère d'utiliser la fonction filter_input() à la place. Il est disponible depuis PHP 5.2.

0

Maintenant Ive a obtenu ceci:

langue $ = mysql_real_escape_string ($ _ POST [ 'langue']); $ country_code = mysql_real_escape_string ($ _ POST ['code_pays']);

  $sql = "insert into shared_content.languages (id,language,country_code) values(NULL,$language,$country_code);"; 
      $res = mysql_query($sql); 

      print("$sql<br>\n"); 
      var_dump($res); 
      print(mysql_error()); 
      mysql_close($link); 

Et la sortie:

insert en shared_content.languages ​​valeurs (id, langue, COUNTRY_CODE) (NULL, PAYS-BAS, NL); bool (false) Colonne inconnue 'PAYS-BAS' dans 'liste de champs'

+0

aah, guillemets simples: – mooizo

+0

$ language = mysql_real_escape_string ($ _ POST ['language']); \t \t \t \t $ country_code = mysql_real_escape_string ($ _ POST ['code_pays']); \t \t \t \t \t \t \t \t \t \t \t \t \t \t $ sql = « insert into shared_content.langues des valeurs (NULL, '$ language', 'country_code de $'); "; \t \t \t \t $ res = mysql_query ($ sql); – mooizo

+0

maintenant il fonctionne, thx un groupe y'all: o) – mooizo