Mysql güncelleyin veya boş değerler takın

4 Cevap php

Çabuk bir soru.

Ben bir veritabanı tablosunda yeni kayıtlar eklemek için php kullanıyorum - kayıt varsa, bir güncelleme komutu yerine çalıştırılır.

Benim soru gelen rekor boş olan alanları var ama zaten veritabanındaki verilerin boş değilse, güncelleme komutu boş değerler, varolan verilerin üzerine etmez mi?

Çok takdir.

4 Cevap

Choog, bu güncelleştirme sorgusu bağlıdır. Tablo adında alanlar varsa: some_id, foo, bar, baz, QUX - ve bu tür gibi PHP komut bir güncelleme var:

"UPDATE table SET foo = '$foo', bar = '$bar', baz = '$baz', qux = '$qux' WHERE some_id = '$id'"

Bu (yazmayı) belirtilen tüm alanları güncelleyecektir. Bu değişkenlerden herhangi null veya boş dize olursa, o zaman evet, bir NULL (izin varsa) veya boş bir dize ile varolan verilerin üzerine yazılır.

Sadece size gereken alanları güncelleştirmek, foo ve örneğin bar, o Baz ve QUX değerlerini değiştirmez söylüyorlar. örneğin

"UPDATE table SET foo = '$foo', bar = '$bar' WHERE some_id = '$id'"

Ben ne yaptığını özelliklerini bilmiyorum, ama sen (http://dev.mysql.com/doc/refman/5.1/en/replace.html) REPLACE INTO ve GÖRMEZDEN (http://dev.mysql.com/doc/refman/5.1/en/insert.html) sorguları yanı INSERT içine bakmak isteyebilirsiniz. Onlar may ne yaptığınızı için daha uygun olacaktır.

Basit bir MySQL güncellemesi ise güncelleme üzerine yazacaktır

UPDATE table SET field = '$newValue' WHERE id = '$id'

İlk verileri doğrulamak için daha iyidir.

Sadece boş olmayan değerleri güncelleştirmek istiyorsanız böyle bir şey yapmak isteyebilirsiniz


$updates = array();
if ($var1 != '') $updates[] = sprintf("`var1` = '%s'", mysql_real_escape_string($var1));
if ($var2 != '') $updates[] = sprintf("`var2` = '%s'", mysql_real_escape_string($var2));
if (count($updates) > 0) {
     $query = sprintf("UPDATE table SET %s WHERE id = '%d' ", implode(", ", $updates), $id);
}

You can use an INSERT ... ON DUPLICATE statement.
And CoALESCE to keep an old value if null has been passed as "new" value.

<?php
$pdo = new PDO('mysql:host=localhost;dbname=test', '...', '...');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

// example table
$pdo->exec('CREATE TEMPORARY TABLE foo (
  id int auto_increment,  
  x int,  
  y int,  
  z int,
  primary key(id), 
  unique key(x) )
');

$stmt = $pdo->prepare("
    INSERT INTO
      foo (x,y,z)
    VALUES
      (:x,:y,:z)
    ON DUPLICATE KEY UPDATE
      y=COALESCE(:y, y),
      z=COALESCE(:z, z)
");
$stmt->bindParam(':x', $x);
$stmt->bindParam(':y', $y);
$stmt->bindParam(':z', $z);


$x = 1; $y = 1; $z=1;
$stmt->execute();
// duplicate key x=1
// overwriting y and z
$x = 1; $y = 2; $z=2;
$stmt->execute();


$x = 2; $y = 20; $z=17;
$stmt->execute();
// duplicate key x=2
// overwriting only z
$x = 2; $y = null; $z=21;
$stmt->execute();

unset($stmt);

foreach($pdo->query('SELECT * FROM foo', PDO::FETCH_NAMED) as $row) {
    foreach($row as $k=>$v) {
    	echo $k, '=', $v, ' ';
    }
    echo "\n";
}

baskılar

id=1 x=1 y=2 z=2 
id=2 x=2 y=20 z=21