使用预准备语句修改一个查询中的多个表

时间:2009-04-20 09:43:32

标签: php mysql

我有以下准备好的查询,我正在使用mysql和php。它允许用户被添加到特定类别,通过$ subcat传入。

$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";
    }

在同一查询中,我想要做的是在检查用户名尚不存在后,在USERS表中插入新记录,只插入用户名。是否可以将$ alterQuery更改为:

最好的做法是什么?

检查用户名,如果是== null,请进行后续插入吗?我可以在同一个if块中执行两个不同的查询吗?

编辑:附加数据库方案以回应评论

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)

2 个答案:

答案 0 :(得分:1)

你为什么要那样做?将查询包含在事务中将是完全提交或回滚。

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

答案 1 :(得分:0)

最好创建一个存储过程:

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 ;

并从您的代码中调用它:

$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";
    }

检查并证明可以在5.2.0-falcon-alpha-community-nt-log

上编译和处理您的架构