Bu hata nedir?

3 Cevap php

Ben bir PHP / MySQL uygulama inşa ediyorum ve benim oluşturmak ve güncelleme sorgusu ile bir sorun haline çalıştırıyorum. Ben de null sütun olarak ayarlanır şamandıra tipi ayarlanır 5 sütun var. Ben daha sonra iş akışında kadar bunları doldurmak için planı yok.

Ancak, bu veritabanı için yeni kayıtlar oluşturmak gerekiyor ve ben de tüm bu 5 şamandıra alanları dokunmadan, varolan kayıtları düzenlemek gerekir. Ben standart bir kimlik nesne olup olmadığını görmek için denetler save() yöntemi kullanır cepten PHP kullanıyorum. Değilse, o create() çağırır, ve eğer öyleyse, o update() çağırır. Genellikle, çok iyi çalışıyor.

update() ve create() yöntemleri o tabloda kullanılan tüm alanları içeren her Sınıf üstündeki bildirilen bir protected static $db_fields nitelik dizi çekmek için tasarlanmıştır . update() ve buna göre, SQL create() bu dizi aracılığıyla çalıştırmak ve ya INSERT INTO veya UPDATE.

Benim anlayış '' (iki tek tırnak, boş) kullanıyorsanız, SQL bu INSERT INTO veya UPDATE isteklerini atlamak ve NULL olarak onları terk edecektir. Orada yöntemler çalıştırdığınızda, değerleri olacak yüzden elbette her yerde sayfada bu 5 şamandıra değerleri için bile form alanları, değil ''.

Neden "Veri kesik" hatası alıyorum ki? Farklı görünüyor - Ben daha önce kesilmiş bir hata görmedim ve ben dahi geliyorum bu yüzden. Teşekkürler.

3 Cevap

'' Ve boş aynı değildir. MySQL sunucu katı modda ise, o zaman sütun için geçersiz verileri geçti beri ekleme yapmak için reddeder. Katı modda olmadan, bir uyarı verir.

mysql> create table a (a float not null);
Query OK, 0 rows affected (0.11 sec)

mysql> insert a values ('');
Query OK, 1 row affected, 1 warning (0.05 sec)

mysql> show warnings;
+---------+------+----------------------------------------+
| Level   | Code | Message                                |
+---------+------+----------------------------------------+
| Warning | 1265 | Data truncated for column 'a' at row 1 |
+---------+------+----------------------------------------+
1 row in set (0.00 sec)

mysql> set sql_mode = 'STRICT_ALL_TABLES';
Query OK, 0 rows affected (0.02 sec)

mysql> insert a values ('');
ERROR 1265 (01000): Data truncated for column 'a' at row 1

Boş değerlere açık eklemek, hatta ekine sütun belirtmek yok ya.

Eğer güncelleme yaparken mysql otomatik olarak değişmeden olanları görmezden çünkü elinizdeki tüm değerleri gönderebilirsiniz.

Eğer veri eklemek için gidiş değildir eğer SQL deyimi olmamalıdır.

Bir örnek olarak, kimlikli bir tablo "Veri" söylüyorlar, float1, float2, float3 ve float4, yalnızca kimliği ekleyerek olacak olan Float5. INSERT bu gibi görünmelidir:

INSERT INTO `Data` ( `id` )
VALUES ( 'Some-ID-Value' )

Yüzen kabul etmek için tanımlanmış ise NULL onlar NULL öndeğer olacak. Aynı GÜNCELLEME tablolar için geçerli, sadece liste alanları değiştirerek olacaktır gerekir.

Bu bir çözüm olarak verilmemiştir, ancak belki de sorun üzerinde biraz daha ışık tutacak.

Bir şamandıra sütuna anahtar kelime açıklamaya BOŞVEREBİLİR ve eklemeye çalıştığınızda'' (veya herhangi bir dize bir sayı ile başlayan değil) eklerseniz, MySQL yerine varsayılan değeri, 0 değerini ekler.

INSERT IGNORE INTO a_table (float_column) VALUE ('')

INSERT IGNORE INTO a_table (float_column) VALUE ('abc')

Her iki varsayılan null olsa bile, 0 ekleyecektir. IGNORE olmadan, tabii ki, hem tablolar görmekte olduğunuz hatayı çıkaracağız.

Eğer temin konum veri beklenen türü ne varsayılan değer ne olduğundan Kısacası, mesajı alır.