PHP / MySQL için doğrulama kütüphanesi

5 Cevap php

Belirli bir dize ya da değer bilinen bir veritabanı türü için geçerli olup olmadığını kolayca kontrol edebilirsiniz PHP için uygun herhangi bir hafif doğrulama kütüphanesi var mı -

Böyle bir şey:

 if (is_MEDIUMINT($var)) {
      $this->db->insert($anothervar);
 }

Teşekkürler!

5 Cevap

INFORMATION_SCHEMA veritabanı kullanabilirsiniz böylece, ANSI 2003 şartnamenin bir parçası olduğunu da (MySQL, PostgreSQL, SQLite, MSSQL 2k5 +) destekleyen herhangi bir DB satıcı karşısında.

/*public static*/ function is_dbtype($table, $column, $type) {
    $db = (...)::getInstance(); // assuming PDO
    $sql = 'SELECT COLUMN_TYPE FROM INFORMATION_SCHEMA.COLUMNS '.
        'WHERE TABLE_NAME = :table AND COLUMN_NAME = :column';
    $st = $db->prepare($sql);
    $st->execute(array(':table' => $table, ':column' => $column));
    return ($type == $st->fetchColumn());
}

Sadece yerine "varchar (64)" nin "varchar" isterseniz Change column_type data_type için. IS_NULLABLE, NUMERIC_PRECISION, CHARACTER_SET_NAME, vb: Eğer daha fazla isterseniz, bol

(Emin değilim is_* fonksiyonlar genellikle ekstra bir veritabanı arama olmadan yapmak yeterli, bu olsa kullanmak şahsen kullanmak istiyorum. Daha da önemlisi, info_schema sunucuda her veritabanı yapısını tutan, bu yüzden buna okuma izinleri verme büyük bir anlaşma olabilir (olmalıdır) olabilir. Eğer paylaşılan bir bilgisayar üzerinde iseniz, büyük olasılıkla hiç buna erişemez.)

MySQL sadece alternatif: do benzer ancak DESCRIBE [table] . Bu rağmen oldukça açık, sen in "bigint" dışında balık gerekecek "bigint (21) imzasız" Kendinizi bu istediğin buysa.

Bu, göründüğü kadar basit değildir, sizin is_MEDIUMINT() işlevi kolayca haline gelebilir:

is_MEDIUMINT()
is_MEDIUMINT_NULL()
is_MEDIUMINT_NOTNULL()
is_MEDIUMINT_UNSIGNED()
is_MEDIUMINT_UNSIGNED_NULL()
is_MEDIUMINT_UNSIGNED_NOTNULL()

Sonra farklı veritabanları türde sorun haline çalıştırmak, örneğin SQLite MySQL en az 5 sahipken tek INT tipi vardır (TINYINT, SMALLINT, {[ (3)]}, INT, BIGINT)}] (7) [{},] (örneğin, (6 [{gibi) adlar hariç, {[(8) ]} ve SERIAL) ve türleri şamandıra - nedeniyle değişken hassas argümana uygulamak için bile zor olurdu. Ben hala sadece DB doğrulanmış olabilir gibi UNIQUE ve Yabancı anahtar Sınırlamalar gibi birçok önemli özellikleri görmezden geliyorum akılda çıplak.

Bu tür işlevler yararlı olacağını düşünüyorum neden katı modda ve çalışmak için veritabanını kurmak eğer sorgu başarısız olursa o zaman sadece size MySQL Kılavuzu alıntı, yanlış bir şey olduğunu biliyorum, değerler eklemek için çalışın, çünkü ben anlamıyorum :

In nonstrict mode, when an out-of-range value is assigned to an integer column, MySQL stores the value representing the corresponding endpoint of the column data type range. If you store 256 into a TINYINT or TINYINT UNSIGNED column, MySQL stores 127 or 255, respectively.

Yine sokulmadan önce değerini doğrulama noktası nedir?

if (is_MEDIUMINT($var)) {
  $this->db->insert($anothervar);
}

else {
  // do what?
}

Eğer hataları bir işlemde sorguyu çalıştırmak önlemek veya INSERT OR IGNORE sözdizimini kullanmak için çalışıyorsanız.

Veritabanına atmak ve o hataları döndürür bakın. Öyle değilse, sen türleri yeterince iyi.

Bu aynı zamanda kullandığınız DBMS onlar bir heves onların değiştirmeye karar verdiğinizde tüm doğrulama işlevleri güncelleştirmek zorunda kalmazsınız Valiation, işleyeceği anlamına gelir. Her şey ölür ve neden çalışmaz kadar Ve büyük olasılıkla bu fark etmez. Kendinizi korumak zorunda az kod, daha kolay hayat :)

Not as far as I know. You could, of course, create your own functions or class to do this, based on the rules of your specific database type.

Üzgünüm daha fazla yardımcı olamam. (Ve diğer kullanıcılar tarafından eğitilmek için mutlu orada bir sınıf / fonksiyonları varsa.)

Sadece PHP is_* fonksiyonları arıyorsunuz?

is_integer, is_float, vb?

Orada get_type, aynı zamanda, ancak bu tip kontrol için kullanılmamalıdır