3 votes

Quelle est la validation correcte pour vérifier si une entrée existe ou non dans la base de données ?

Exemple de ma table MySQL

content_id  content_user  content_title        content_slug
---------------------------------------------------------------------
1           1             Hello World          hello-world
2           1             Hello Stackoverflow  hello-stackoverflow
3           2             Fix me               fix-me
4           3             Testing              testing

Mise à jour


content_slug est une clé unique.

$input = 'Hello World';
$slug  = function_slug($input); // this will be hello-world

/* begin the validation */
$query = $db->query("SELECT * 
                    FROM tbl_content 
                    WHERE content_slug='{$slug}'
                    ");
$data  = $db->fetch($query);
$check = $db->num_rows($query);

if($check == 1) {
$seo = $slug;
 } else {
$seo  = $slug.'-'.time();
}
/* end the validation */

$db->query("UPDATE tbl_content 
            SET content_slug= '{$db->escape($seo)}'
            WHERE content_id ='{$db->escape($id)}'
            AND content_user ='{$db->escape($_SESSION['user_id'])}'
           ");

Un peu long :) Ici, je voudrais savoir quelle est la validation correcte que je dois utiliser si je veux

  • Si hello-world = actuel content_user utiliser le premier if
  • Si hello-world <> actuel content_user y hello-world existe déjà dans la base de données, utilisez la fonction } else {

Tenez-moi au courant.

1voto

jswolf19 Points 2007

Je ne pense vraiment pas que vous souhaitiez ce que vous demandez, mais cette solution répond à vos attentes en une seule requête de mise à jour.

UPDATE tbl_content 
            SET content_slug= IF(content_user = '{$db->escape($_SESSION['user_id'])}',
                                 content_slug,
                                 CONCAT(content_slug, '-',  DATE_FORMAT(now(), '%Y%m%d%H%i%s%f')))
            WHERE content_id ='{$db->escape($id)}'

ADDITION

J'imagine que vous souhaitez insérer une nouvelle ligne dans votre tableau pour le nouvel utilisateur, auquel cas vous aurez besoin d'une instruction d'insertion. Si vous souhaitez insérer une nouvelle ligne quoi qu'il arrive, cette instruction devrait vous convenir :

$slug = "'$db->escape($slug)'";
$db->query("INSERT INTO tbl_content (content_user, content_title, content_slug)
            SELECT '{$db->escape($_SESSION['user_id'])}', '{$db->escape($title)}',
                   IF(EXISTS(SELECT content_id FROM tbl_content WHERE content_slug = $slug),
                      CONCAT($slug, DATE_FORMAT(now(), '-%Y%m%d%H%i%s%f')), $slug)");

Toutefois, si, pour une raison quelconque, vous ne souhaitez insérer une nouvelle ligne que si vous n'avez pas la même content_user comme avant, alors vous pouvez accepter la laideur ici :

$slug = "'{$db->escape($slug)}'";
$user = "'{$db->escape($_SESSION['user_id'])}'";
$db->query("INSERT INTO tbl_content (content_user, content_title, content_slug)
            SELECT $user, '{$db->escape($title)}',
                   IF(EXISTS(SELECT content_id FROM tbl_content WHERE content_slug = $slug),
                      CONCAT($slug, DATE_FORMAT(now(), '-%Y%m%d%H%i%s%f')), $slug)
            FROM tbl_content
            WHERE NOT EXISTS(SELECT content_id FROM tbl_content
                             WHERE content_slug = $slug AND content_user = $user)
            LIMIT 1"));

0voto

CoolStraw Points 2012
 UPDATE <table> SET <field> = <new value> **WHERE** <current User> != <hello world>

0voto

Christophe Points 2821

Je pense que ce serait quelque chose comme ça :

$input = 'Hello World';
$slug1  = function_slug($input); // this will be hello-world

$query = $db->query("SELECT * 
                    FROM tbl_content 
                    WHERE content_slug='{$slug1}'
                    ");
$data  = $db->fetch($query);
$check = $db->num_rows($query);

if($check == 1)
$slug2  = $slug1.'-'.time();
$db->query("UPDATE tbl_content 
            SET content_slug= '{$db->escape($slug2)}'
            WHERE content_id ='{$db->escape($id)}'
            AND content_user ='{$db->escape($_SESSION['user_id'])}'
            AND content_slug <> '{$db->escape($slug1)}'
           ");

<> signifie pas égal, != devrait également faire l'affaire. Le where supplémentaire ne sera mis à jour que si content_slug n'est pas égal à hello-world

0voto

Raffael Points 5837

Je pense que votre logique de base de données est défectueuse. Mais pour répondre à votre question précise : il suffit d'ajouter un UUID et, quel qu'il soit, il sera unique. mais qu'est-ce que content_slug et pourquoi devrait-il être unique ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X