Neden benim güncelleştirme komutu aynı kimliğine sahip tüm alanları güncelliyor?

5 Cevap php

Update komutunu kullanarak, veritabanındaki belirli bir giriş için type_name değiştirmek istiyorum, ama o [(2)] aynı {tüm girişler için type_name değişiyor }.

Ben sadece o tek girişin type_name değiştirmeniz gerekir, ve type_name aynı type_id ile tüm girişleri ile ilişkili değil.

Ben bir güncelleştirme sorgusu vardır:

$sql = 'UPDATE photos
       LEFT JOIN types 
       ON photos.type_id = types.type_id
       SET photos.photo_title = $_POST['photo_title'], 
           types.type_name = $_POST['type_name']
       WHERE photos.photo_id = 3';

İşte kullanıyorum formun:

<form name="form1" method="post" action="">
    <input name="photo_title" type="text" value=""/>
    <textarea name="type_name"></textarea>
    <input type="submit" name="update" value="Update entry" />
</form>

İşte benim veritabanı yapısı bulunuyor:

TABLO fotoğraflar

  • photo_id PRIMARY KEY

  • photo_title

  • YABANCI KEY type_id

TABLO türleri

  • PRIMARY KEY type_id

  • type_name

5 Cevap

Ne oluyor size katılmak verilerin yanlış set üretiminde olmasıdır. Sen type_id üzerinde fotoğrafları ve türlerini katılmadan ediyoruz.

Şimdi ne açıklayan gibi görünüyor türleri sütun aynı type___id ile birden çok satır içerebilir olmasıdır. Bu ne anlama geliyor? Bu katılmak katılmak n tipleri fotoğrafla aynı type_id olan satır sayısı n satırları, üretecek, her fotoğraf için, özellikle (her fotoğraf için (photos,types) birden çok çift üretecek anlamına gelir .)

Bunu düzeltmek için nasıl gibi, veritabanı tasarımı bir göz atmalısınız. Her fotoğraf için türleri benzersiz bir satır beklemek gibi görünüyor. Bu nasıl ilişki ifade edilir? O senin katılmak için uygun bir ON maddesini almak sağlayacaktır.

UPDATE

Tablo yapısı baktıktan sonra, bu sizin veritabanı biraz daha farklı şeyler ifade ediyor gibi görünüyor. Eğer aynı tip (yani resmi tablodaki typeid aynıdır) ile birden fazla fotoğraf olabilir duruyor gibi. Böylece sadece böyle bir fotoğrafın typename değişen konuşmak için biraz anlamsız. Sen sadece isim de güncelliyor Fotoğrafın türü ne belirli bir türü için typename güncelliyoruz.

Şimdi tam olarak ne burada, başarmak için çalışıyoruz?

  • Yeniden belirli bir fotoğrafı kategorize çalışıyorsanız, o zaman yerine türleri tabloda yeni bir giriş oluşturmak ve bu yeni kayıt için fotoğraf gelin veya eşleşen ada sahip olan bir fotoğrafı bulmak ve bu rekor fotoğrafı işaret ya istiyorum . (Ben zaten fotoğraf ekleme mantığı böyle kod var sanırım. Bu benzer olmalı)
  • Eğer bu tip bir fotoğraf ve diğer tüm fotoğraflar için tip açıklamasını güncellemek için çalışıyorsanız, o zaman ne var sadece iyi çalışır.

MySQL bu olanak şaşırdım, ama türü tabloda adını güncelliyoruz gibi görünüyor. Muhtemelen fotoğrafları tablodaki tek satırın type_id güncellemek için arıyoruz.

Böyle yapabilirdi:

UPDATE photos
SET photos.photo_title = $_POST['photo_title'], 
    photos.type_id = (
        select type_id 
        from types 
        where type_name = $_POST['type_name']
    )
WHERE photos.photo_id = 3

Veya alternatif olarak:

UPDATE photos
LEFT JOIN types ON types.type_id = $_POST['type_name']
SET photos.photo_title = $_POST['photo_title'], 
    photos.type_id = types.type_id
WHERE photos.photo_id = 3

Bu sorguyu çalıştırmadan önce, emin type_name var yapabilir:

REPLACE INTO types (type_name) VALUES ($_POST['type_name'])

I need it to only change that individual entry's type_name, and not the type_name that is associated with all the entries with the same type_id.

Bu temel bir sorundur. Orada sadece hiç typeid başına türleri veritabanında bir rekor olacak, bu yüzden bunu değiştirmek zaman, etkin başvurduğu her fotoğraf için değiştirir oluyor ki typeid.

Saklamak gerekiyorsa farklı bir type_name her fotoğraf için, sadece photos tabloda bir sütun oluşturmak ve orada saklayın.

Bunu yapmanın başka yolu types tabloya yeni bir kayıt oluşturmak için her zaman bir type_name düzenlendiğinde - belki bazı başka resimleri de kullanarak olup olmadığını görmek için kontrol yapıyor o { [(2)]} (değilse güvenle varolan kayıt güncelleme). Ama kendiniz için bunu yapan bir kod uygulamak zorunda.

Birden fazla satır güncellendi ediliyor ise o zaman tabloları güncellemek için benzersiz bir anahtar kullanarak değil. Bu tablolar ilişkiyi anlamak zor ama 1 gibi görünüyor: bir tür birçok fotoğraf eklenebilir M ilişki?

Eğer öyleyse o zaman WHERE yan tümcesinde type_id kullanarak fotoğrafları tablo güncelleştirme varsa tabii ki birden fazla tablo güncellenir. Kullanmak sadece birincil anahtarlar şu belirli bir satır güncellemek istiyorsanız güncellemek için özeldir.

Eğer iyi bir çözüm istiyorsanız tabloların ilişkileri belirtmeniz gerekir :)

$sql = 'UPDATE photos
       LEFT JOIN types 
       ON photos.type_id = types.type_id
       SET photos.photo_title = $_POST['photo_title'], types.type_name = $_POST['type_name']
       WHERE photos.photo_id = 3 LIMIT 1';

Bir yan not olarak, yapıyor olması shoule

$photo_title = escape_function( $_POST['photo_title'] )
$type_name = escape_function( $_POST['type_name'] )

ve sorgu dizesinde 'in varialble isimleri sarma.