2010-07-19 8 views
1

Je cherche un moyen de créer une sorte de fonction dans php et mysql qui me donne comme résultat l'identifiant d'un enregistrement dans un tableau simple.Interaction PHP-MySQL très rapide

J'ai une table id -> value où l'id est un champ auto-incrémenté.

La façon naturelle ou la manière simple je sais est:

$myId = Check('Cheese'); 

function Check($value) { 



     $sql = "SELECT id FROM table WHERE value = '$value'"); 


     $res = mysql_query($sql); 

     if ($res) 

     return mysql_result($res,0); 


     // If the record doesn't exist then continue to insert the record 

     $sql = "INSERT INTO table (value) values ('$value')"; 

     $res = mysql_query($sql); 

     return mysql_insert_id(); 

} 

Ok, je pense que c'est la façon classique .. mais je pense qu'il doit y avoir une commande MySQL ou quelque chose qui font les choses plus simples.

Je sais qu'il existe un INSERT IGNORE mais existe-t-il un moyen de faire le select uniquement s'il n'existe pas et de retourner l'ID?

Je veux faire quelque chose comme:

Select de la table où la valeur = 'factice' sinon existe alors Insérer dans la table des valeurs ('factice')

(valeur) donc i « ll obtenir l'ID en une seule étape et MySQL va résoudre le problème et le code sera plus efficace ou rapide ..

(imaginez que je suis arrivé ce faire 10000 fois)

Répondre

3

utilisation INSERT. .. oN DUPLICATE KEY UPDATE

function Check($value) { 
    $sql = "INSERT INTO table (value) values ('$value') ON DUPLICATE KEY UPDATE value='$value'"; 
    $res = mysql_query($sql); 
    return mysql_insert_id(); 
} 

nécessite MySQL 5.1.12 ou plus tard

+0

Cette fonctionnalité existe également dans 5.0, http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html, et nécessite une clé unique sur la colonne 'value'. – ceteras

+0

Ok Juste pour moi Merci c'est vrai que j'ai besoin de définir l'index unique sur la chaîne mais ça marche – diego2k

0

Si vous un En supposant qu'il existe une forte probabilité que la plupart des appels Check() aboutissent à INSERTs, vous pouvez faire INSERT IGNORE et utiliser mysql_affected_rows pour vérifier s'il y avait un insert. S'il n'y avait pas d'insert, vous pouvez lancer un SELECT SELECT FROM et utiliser mysql_insert_id(). Toutefois, s'il est plus probable que la ligne existe, il est préférable d'exécuter une instruction SELECT en premier.

http://php.net/manual/en/function.mysql-affected-rows.php

Si l'économie des ressources est votre objectif principal qui est. Vous devrez probablement exécuter les deux requêtes, même si elles sont combinées en une seule instruction.

0

Vous voulez probablement WHERE NOT EXISTS. Jetez un oeil à l'exemple suivant pour avoir une idée:

INSERT INTO table (valeur) id SELECT WHERE NOT EXISTS (SELECT * FROM table où la valeur = 'chose à vérifier) ​​LIMIT 1

+0

Mais cette revenir l'ID si elle existe déjà? – casablanca