Yanlış bir tablo adı, php / mysql

5 Cevap php

Ben bu kod var

        mysqli_query ( $userdatabase,
        'CREATE TABLE `user_'.$emailreg.'` (
        ID int NOT NULL AUTO_INCREMENT PRIMARY KEY,

        IP varchar(10),
        FLD1 varchar(20),
        FLD2 varchar(40),
        FLD3 varchar(25),
        FLD4 varchar(25),
        FLD5 varchar(25) )' );

        echo ( mysqli_error ($userdatabase) );

O benim localhost üzerinde çalışıyor, ama ben sunucuya yüklediğinizde, bana hata bir "Yanlış bir tablo adı 'user_vasya@rossya.pu'" vererek başlar. Herhangi bir fikir?

Teşekkürler!

5 Cevap

En kısa sürede size "Ben kullanıcı başına bir tablo oluşturmak" demek gibi bu ben Metadata Tribbles çağrı bir antipattern olduğunu. Sorun bu tabloları kontrolden yeniden eğiliminde olmasıdır. :-)

Bunun yerine, bir nitelik olarak kullanıcının e-posta için bir sütun ile bir tablo oluşturmanız gerekir.

Eğer delimited identifiers, SQL tablo adlarını can özel karakterler içeren, hatta boşluk, SQL ayrılmış sözcükleri, uluslararası karakterler, vb kullanabilirsiniz Ama alırsanız geri çekil-tırnak ise, {[ (2)]} ve SQL çözümleyici karıştırır, çünkü ., bir tanımlayıcı için geçerli karakter değildir. Bu düşünün: Eğer bir değişken adı veya sınıf adına geçerli bir karakter olarak kabul herhangi bir diğer programlama dilleri . kullanabilirim?

Diğer ipuçları:

IP daha kolay INT UNSIGNED olarak saklanır ve işlevleri INET_ATON() ve INET_NTOA() ikili ve bir IP adresi bir dize dönüştürmek için var olduğunu eşdeğer. Bu size yanlışlıkla geçersiz bir IP adresini saklamak yok emin olun yardımcı olur. Ayrıca ikili formda bir IP adresine karşı alt maskeleme işlemleri yapmak için Bit ikili operatörleri kullanabilirsiniz.

Sütunlar FLD1, FLD2, FLD3 vb açıklayıcı değildir ve siz yeterince bu tabloyu tasarlanmış değil göstermektedir. Hatta çok değerli özelliklerini yönetmek için split this table into a few separate tables gerekebilir. Ama bir senin kolonları soyut adlandırılır beri bu nasıl söyleyemem.

Tablo isimleri bir @ veya . içeremez. Ayrıca, ne yapmaya çalıştığını çok kötü veritabanı tasarımı. Tek bir tablo kullanın ve bir anahtar olarak e-posta adresini (ya da daha iyisi, bir tamsayı olarak başka bir tablodan bir ID) ekleyin.

Bu dosya sisteminin hatalı dosya gibi görünüyor.

Ama yine de her kullanıcı için bir tablo oluşturmak gerekir. Bu User_id alan ile birlikte tüm kullanıcılar için tek bir tablo olmalıdır.

Benim ilk düşünce "bir tablo için OMG! Ne korkunç bir isim oldu!" :-)

MySQL dokümanlar belirtiyorlar:

Veritabanı ve tablo adları ".", "\", "/" Içeren veya dosya adlarında izin verilmeyen karakterler olamaz.

İkinizin sayıları, . etki alanı adı ve (muhtemelen) @ seperatörünün o ihlal sanıyorum.

Muhtemelen e-posta adresine (veya başka bir benzersiz kimlik) üzerine kademeli one tablo olan düşünmelisiniz.

Tablo adları @ veya içeremez ..