изменение нескольких таблиц в одном запросе с помощью подготовленного оператора - PullRequest
0 голосов
/ 20 апреля 2009

У меня есть следующий подготовленный запрос, который я использую с 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?

edit: прикрепление схемы базы данных в ответ на комментарий

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 ]

1 голос
/ 20 апреля 2009

Почему вы хотите это сделать? Включение ваших запросов в транзакцию будет либо полным подтверждением, либо откатом.

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

0 голосов
/ 20 апреля 2009

Лучше всего будет создать хранимую процедуру:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...