Простая функция вставки или обновления PHP PDO

Пытаясь создать простую функцию обновления PHP PDO, которая, если поле не найдено, вставит его, я создал этот небольшой фрагмент.

function updateorcreate($table,$name,$value){
    global $sodb;
    $pro = $sodb->prepare("UPDATE `$table` SET value = :value WHERE field = :name");
    if(!$pro){
        $pro = $sodb->prepare("INSERT INTO `$table` (field,value) VALUES (:name,:value)");
    }
    $pro->execute(array(':name'=>$name,':value'=>$value));
}

Однако он не определяет, будет ли функция обновления работать с if(!$pro); Как бы мы заставили эту функцию работать.


person RIK    schedule 05.09.2012    source источник
comment
Я все еще привыкаю к ​​этому, но не вернусь к MySQL   -  person RIK    schedule 05.09.2012
comment
-1 за использование global   -  person PeeHaa    schedule 05.09.2012
comment
Сначала вам нужно execute() его, прежде чем вы сможете определить, вызвало ли обновление обновление строк с помощью numRows(), но если поле уже существует с тем же значением, вы также можете получить непредвиденные результаты.   -  person Ja͢ck    schedule 05.09.2012
comment
Запрос на обновление не дает ошибки, это правильный запрос, который не обновляет никаких записей.   -  person rael_kid    schedule 05.09.2012
comment
@Lex, но он выполняет свой первый запрос только внизу, поэтому условие if бесполезно.   -  person Ja͢ck    schedule 05.09.2012


Ответы (4)


Вы назначаете $pro оператору подготовки, а не оператору выполнения.

Сказав это, если вы используете mysql, вы можете использовать синтаксис insert... on duplicate key update.

insert into $table (field, value) values (:name, :value) on duplicate key update value=:value2

Вы не можете использовать один и тот же связанный параметр дважды, но вы можете установить для двух связанных параметров одно и то же значение.

Изменить: этот синтаксис mysql будет только работать там, где присутствует ключ (первичный или другой уникальный), и это приведет к сбою вставки.

person Fluffeh    schedule 05.09.2012
comment
Вот что я пробовал: function updateorcreate($table,$name,$value){ global $sodb; $pro = $sodb-›prepare(INSERT INTO $table (field, value) values ​​(:name, :value) ON DUPLICATE KEY update value = :value2); $pro-›execute(array(':name'=›$name,':value'=›$value,':value2'=›$value)); } - person RIK; 05.09.2012
comment
@RobinKnight Извините, я должен был сразу же упомянуть об этом, у вас есть уникальное ограничение, установленное в таблице для столбца field, да? - person Fluffeh; 05.09.2012
comment
Нет, возможно, я должен, потому что не должно быть причин, чтобы они когда-либо повторяли - person RIK; 05.09.2012
comment
@RobinKnight Извините за этого приятеля, да, синтаксис будет работать, только если столбец ограничен. Извините, надо было упомянуть об этом с самого начала :( - person Fluffeh; 05.09.2012
comment
PDO действительно должен позволить вам использовать один и тот же параметр дважды. - person Jonathon; 19.06.2013

Если это только для mysql, вы можете попробовать INSERT INTO... ON DUPLICATE KEY UPDATE

http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html

person Louis Huppenbauer    schedule 05.09.2012

Сначала вам нужно будет выполнить его.

Кроме того, это изворотливый способ сделать это. Было бы лучше начать транзакцию, сделать SELECT, а затем определить, что делать (INSERT или UPDATE). Недостаточно просто проверить, успешно ли выполнен запрос UPDATE, он также завершается успешно, когда не найдено ни одной строки.

person Sherlock    schedule 05.09.2012
comment
Хорошо, я пытался посмотреть, сможем ли мы обойти этот шаг, но если это небезопасно, я не буду - person RIK; 05.09.2012
comment
SELECT тоже довольно хитрый способ сделать это. Лучше было бы иметь уникальный ключ на поле, а потом использовать INSERT ... ON DUPLICATE KEY UPDATE .... - person cHao; 05.09.2012
comment
Я никогда не читал, что он хочет полностью избежать дублирования. Он просто не хочет этого в этой конкретной ситуации. - person Sherlock; 05.09.2012

пытаться,

    PDO::exec() 

возвращает 1, если вставлен. 2, если строка была обновлена.

для подготовленных заявлений,

    PDOStatement::execute() 

Можешь попробовать,

    PDOStement::rowCount()
person FirmView    schedule 05.09.2012