web-dev-qa-db-fra.com

$ wpdb-> prepare avec ON DUPLICATE KEY UPDATE

Je viens de prendre la ce code } de la page Codex de $ wpdb et de modifier ma requête d'insertion existante:

$table = $wpdb->prefix . 'user_req';

$post_id = explode('_', $_POST['post_id']);
$user_id = $_POST['user_id'];
$wpdb->insert( 
        $table,
        array(
            'user_id' => $user_id,
            'post_id' => $post_id[1]
        ),
        array( 
            '%d',
            '%d'
        )
    );

dans:

$wpdb->query( $wpdb->prepare( 
            "
                INSERT INTO {$wpdb->prefix}user_req
                ( user_id, post_id )
                VALUES ( %d, %d )
                ON DUPLICATE KEY UPDATE
                user_id = VALUES(user_id), post_id = VALUES(post_id)
            ", 
            $user_id, 
            $post_id[1]
        ) );

Parce que j'ai besoin deempêcher les entrées en doubleentrer dans la base de données. Cependant, les entrées en double entrent dans la base de données pendant que la requête d'insertion fonctionne correctement. Pour ajouter la portion ON DUPLICATE KEY UPDATE, j'ai suivi la Réponse de s_ha_dum } sur un autre thread.

Qu'est-ce que je fais mal?

1
Mayeenul Islam

C'est de ma faute. Vous avez la solution après le commentaire de @ Otto:

Avez-vous réellement une clé en double ici? Quelle est la structure de user_req et quels sont les clés et les index?

Voici comment ma requête SQL devrait être:

INSERT INTO {$wpdb->prefix}user_req
                ( user_id, post_id )
                VALUES ( %d, %d )
                WHERE NOT EXISTS (
                  SELECT * FROM
                  {$wpdb->prefix}user_req.user_id = user_id
                  AND
                  {$wpdb->prefix}user_req.post_id = post_id
                )

Correction maintenant. Merci à Otto.

METTRE À JOUR

Bien que j'ai dit, c'est résolu, mais en fait, ce n'est pas. Le code ne fonctionnait pas et n'insérait même pas de données ( Détails ici ). Donc, avec la connaissance que j'avais des autres et avec l'aide de mon collègue M. Ariful Haque, je l'ai fait avec deux requêtes différentes mais imbriquées l'une dans l'autre:

    $alreadyGot = $wpdb->get_results(
                        "SELECT
                        COUNT(*) AS TOTALCOUNT
                        FROM {$table}
                        WHERE ( user_id = $user_id AND post_id = $post_id[1] )
                            AND ( order_id = '' )"
                    );

    $count = $alreadyGot[0]->TOTALCOUNT; //if there's any duplicate, it'd return 1

    // if the count return 1, do nothing, but else insert the data
    if( $count > 0 ) {
        //do nothing
    } else {
        $wpdb->insert( 
            $table,
            array(
                'user_id' => $user_id,
                'post_id' => $post_id[1]
            )
        );
    }
0
Mayeenul Islam