2009-04-20 6 views
0

J'ai la requête préparée suivante que j'utilise avec mysql et php. C'est pour permettre aux utilisateurs d'être ajoutés à une catégorie particulière, transmise via $ subcat.Modification de plusieurs tables dans une requête avec une instruction apliquée

$alterQuery = "UPDATE AUCTIONS SET subcat= ? WHERE article_no= ?"; 
    if ($altRecord = $con->prepare($alterQuery)) { 
     $altRecord->bind_param("ss", $subcat, $pk); 
     $altRecord->execute(); 
    $altRecord->close(); 
    echo "true"; 
    } 

Ce que je voudrais faire, dans la même requête, est d'insérer un nouvel enregistrement dans la table des utilisateurs n'insérant le nom d'utilisateur, après avoir vérifié que le nom d'utilisateur n'existe pas déjà. Est-il possible de simplement changer $ alterQuery à:

Quel est le meilleur quoi faire?

Vérifiez le nom d'utilisateur, et si == null, faites un insert suivant? puis-je avoir deux requêtes différentes exécutées dans le même bloc?

modifier: schéma de base de données en réponse à la fixation des commentaires

AUCTIONS  

    ARTICLE_NO  varchar(20) primary key 
    ARTICLE_NAME varchar(100) 
    SUBTITLE varchar(20) 
    CURRENT_BID  decimal(5,2) 
    START_PRICE  decimal(5,2) 
    BID_COUNT varchar(20) 
    QUANT_TOTAL  varchar(20) 
    QUANT_SOLD varchar(20) 
    ACCESSSTARTS varchar(30) 
    ACCESSENDS varchar(20) 
    ACCESSORIGIN_END varchar(20) 
    USERNAME varchar(20)  
    BEST_BIDDER_ID varchar(20)  
    FINISHED tinyint(4) 
    WATCH tinyint(4)  
    BUYITNOW_PRICE decimal(5,2)  
    PIC_URL  varchar(120)  
    PRIVATE_AUCTION  tinyint(4) 
    AUCTION_TYPE varchar(20)  
    ACCESSINSERT_DATE varchar(20) 
    ACCESSUPDATE_DATE varchar(20) 
    CAT_DESC varchar(20)  
    CAT_PATH varchar(20)  
    ARTICLE_DESC text  
    COUNTRYCODE  varchar(20) 
    LOCATION varchar(20) 
    CONDITIONS varchar(20) 
    REVISED  tinyint(4) 
    PAYPAL_ACCEPT tinyint(4) 
    PRE_TERMINATED tinyint(4) 
    SHIPPING_TO  varchar(20) 
    FEE_INSERTION decimal(5,2) 
    FEE_FINAL decimal(5,2) 
    FEE_LISTING  decimal(5,2) 
    PIC_XXL  tinyint(4) 
    PIC_DIASHOW  tinyint(4) 
    PIC_COUNT varchar(20) 
    ITEM_SITE_ID varchar(20) 
    STARTS datetime  
    ENDS datetime  
    ORIGIN_END datetime 
    SUBCAT varchar(20) 

USERS 
    username varchar(30) primary key 
    firstname varchar(30) 
    lastname varchar(30) 
    flaggedauctions  varchar(30) 
    lastauction  varchar(30)  
    street1  varchar(30)  
    city1 varchar(30)  
    postcode1 varchar(30) 
    street2  varchar(30) 
    city2 varchar(30)  
    postcode2 varchar(30) 
    phone varchar(30)  
    mobilephone  varchar(30) 
    fax  varchar(30)  
    email varchar(30)  
    website  varchar(30) 
    bank varchar(30)  
    banknumber varchar(30) 
    accountnumber varchar(30) 
    comments varchar(30) 

Répondre

0

Il sera préférable de créer une procédure stockée:

DELIMITER $$ 
CREATE PROCEDURE prc_add_user_to_category(_subcat VARCHAR(20), _article_no VARCHAR(20), _username VARCHAR(30)) 
BEGIN 
     UPDATE AUCTIONS 
     SET  subcat= _subcat 
     WHERE article_no= _article_no; 
     INSERT 
     INTO users (username) 
     VALUES (_username) 
     ON DUPLICATE KEY 
     UPDATE 
     username = username; 
END 
$$ 
DELIMITER ; 

et l'appeler à partir de votre code:

$alterQuery = "CALL prc_add_user_to_category(?, ?, ?)"; 
    if ($altRecord = $con->prepare($alterQuery)) { 
     $altRecord->bind_param("ss", $subcat, $pk, $userid); 
     $altRecord->execute(); 
    $altRecord->close(); 
    echo "true"; 
    } 

Vérifié et se sont révélés compiler et travail contre votre schéma sur 5.2.0-falcon-alpha-community-nt-log

+0

Cela a échoué complètement avec mysql 5.0. J'ai essayé les éléments suivants: CREATE PROCEDURE addToCategory (_subcat INT, INT _article_no, _username INT) BEGIN DECLARE MISE À JOUR ENCHÈRES SET subcat = _subcat OÙ article_no = _article_no; INSERT INTO utilisateurs (nom d'utilisateur) VALUES (_nom d'utilisateur) SUR LA MISE À JOUR DE LA CLÉ DUPLICATE SET username = nomutilisateur; END Il est dit de vérifier ma syntaxe près de UPDATE AUCTIONS –

+0

Il donne maintenant: # 1064 - Vous avez une erreur dans votre syntaxe SQL; consultez le manuel qui correspond à votre version du serveur MySQL pour la bonne syntaxe à utiliser à proximité) BEGIN MISE À JOUR ENCHÈRES SET subcat = _subcat WHE 'à la ligne 1 –

+0

Ajouter longueur à une définition VARCHAR – Quassnoi

1

Pourquoi voudriez-vous faire cela? L'inclusion de vos requêtes dans une transaction sera soit une validation complète soit une restauration.

http://en.wikipedia.org/wiki/ACID#Atomicity

+0

Comment est l'opération que je suis NT à effectuer non atomique. Il est toujours ajouté à une catégorie et le nom d'utilisateur est ou n'est pas inséré. –

+0

Jusqu'à 1, parce que les transactions sont la voie à suivre. Bien sûr, vous pouvez insérer conditionnellement, mais dans la transaction. De cette façon, si une erreur se produit, le tout sera annulé, et dans le bon cas, vous obtiendrez ce que vous voulez. Agréable et propre. –

+0

Je pensais que mes requêtes seraient une transaction? –

Questions connexes