2009-04-20 3 views
0

У меня есть следующий подготовленный запрос, который я использую с mysql и php. Он позволяет добавлять пользователей в определенную категорию, передаваемую через $ subcat.изменение нескольких таблиц в одном запросе с помощью оператора aprepared

$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) 

ответ

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

+0

Это не удалось с помощью mysql 5.0. Я попробовал следующее: CREATE PROCEDURE addToCategory (_subcat INT, INT _article_no, _username INT) НАЧАТЬ DECLARE UPDATE SET АУКЦИОНАХ подкатегорию = _subcat ГДЕ article_no = _article_no; INSERT INTO пользователи (имя пользователя) VALUES (_username) ON DUPLICATE KEY UPDATE SET username = имя пользователя; END Он сказал, чтобы проверить мой синтаксис рядом с UPDATE AUCTIONS – 2009-04-20 10:01:40

+0

Теперь он дает: # 1064 - У вас есть ошибка в синтаксисе SQL; проверьте руководство, которое соответствует версии сервера MySQL для правильного синтаксиса, чтобы использовать рядом с «) НАЧАТЬ UPDATE ТОРГИ SET подкатегории = _subcat WHE» в строке 1 – 2009-04-20 10:20:08

+0

Добавить длину определения VARCHAR – Quassnoi

1

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

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

+0

Как работает операция nt выполнять не атомарно. Он всегда добавляется в категорию, а имя пользователя либо вставлено, либо не вставлено. – 2009-04-20 10:03:12

+0

До 1, потому что транзакции - это путь. Конечно, вы можете условно вставить, но внутри транзакции. Таким образом, если произойдет ошибка, все будет отброшено назад, и в хорошем случае вы получите то, что хотите. Хороший и чистый. –

+0

Я думал, что мои запросы будут транзакцией? – 2009-04-20 10:21:31

Смежные вопросы