MySQL PHP dizi kaydedilsin mi?

12 Cevap php

Tek bir mysql alana veri dizisini kaydetmek için iyi bir yolu nedir?

Ben mysql tabloda bu dizi için sorgulamak da bir kez, geri dizi forma almak için iyi bir yolu nedir?

Serialize ve cevap unserialize mı?

12 Cevap

Tek bir alana bir dizi depolamak için good yolu yoktur.

Sen ilişkisel verileri incelemek ve şema uygun değişiklikleri yapmanız gerekir. Bu yaklaşımın bir referans için aşağıda örneğe bakın.

Eğer must, tek bir alana dizi kaydedin sonra serialize() ve unserialize() fonksiyonlar hile yapacak. Ama gerçek içeriğine sorguları yapamazsınız.

Seri hale fonksiyonuna alternatif olarak json_encode() ve json_decode() da vardır.

Aşağıdaki bir dizi göz önünde

$a = array(
    1 => array(
        'a' => 1,
        'b' => 2,
        'c' => 3
    ),
    2 => array(
        'a' => 1,
        'b' => 2,
        'c' => 3
    ),
);

Veritabanına kaydetmek için böyle bir tablo oluşturmak gerekir

$c = mysql_connect($server, $username, $password);
mysql_select_db('test');
$r = mysql_query(
    'DROP TABLE IF EXISTS test');
$r = mysql_query(
    'CREATE TABLE test (
      id INTEGER UNSIGNED NOT NULL,
      a INTEGER UNSIGNED NOT NULL,
      b INTEGER UNSIGNED NOT NULL,
      c INTEGER UNSIGNED NOT NULL,
      PRIMARY KEY (id)
    )');

Eğer bu gibi sorguları gerçekleştirebilirsiniz kayıtları ile çalışmak için (ve evet bu bir örnektir, dikkat!)

function getTest() {
    $ret = array();
    $c = connect();
    $query = 'SELECT * FROM test';
    $r = mysql_query($query,$c);
    while ($o = mysql_fetch_array($r,MYSQL_ASSOC)) {
        $ret[array_shift($o)] = $o;
    }
    mysql_close($c);
    return $ret;
}
function putTest($t) {
    $c = connect();
    foreach ($t as $k => $v) {
        $query = "INSERT INTO test (id,".
                implode(',',array_keys($v)).
                ") VALUES ($k,".
                implode(',',$v).
            ")";
        $r = mysql_query($query,$c);
    }
    mysql_close($c);
}

putTest($a);
$b = getTest();

connect() fonksiyonu mysql bağlantı kaynağı döndürür

function connect() {
    $c = mysql_connect($server, $username, $password);
    mysql_select_db('test');
    return $c;
}

Genellikle, evet, seri ve unserialize gitmek için yoludur.

Veri olsa da basit bir şey, bir virgülle sınırlandırılmış bir dize olarak tasarruf ise muhtemelen depolama alanı için daha iyi olurdu. Eğer dizi sadece bir sayı listesi olacağını biliyorsanız, örneğin, sonra çöktüğünü / patlayabilir kullanmalısınız. Bu 1,2,3 ve a:3:{i:0;i:1;i:1;i:2;i:2;i:3;} arasındaki fark.

Değilse, o zaman seri ve tüm durumlar için unserialize çalışma.

Herkes dizi seri hale anlaşılacağı neden Ahh, bilmiyorum.

Ben en iyi yolu aslında veritabanı şeması içine sığdırmak olduğunu söylüyorlar. Hiçbir fikrim yok (ve hiçbir ipucu verdi) sizin dizideki verilerin gerçek semantik anlamı hakkında, ama böyle dizileri saklamak için iki yol genellikle vardır

create table mydata (
  id int not null auto_increment primary key,
  field1 int not null,
  field2 int not null,
  ...
  fieldN int not null
)

Bu şekilde tek bir satırda dizinizi depolamak.

create table mydata (
    id int not null auto_increment primary key,
    ...
)

create table myotherdata (
    id int not null auto_increment primary key,
    mydata_id int not null,
    sequence int not null,
    data int not null
)

İlk yöntemin dezavantajı, dizideki birçok öğe varsa, bu tablo ile çalışan en zarif şey olmayacak, tabii ki vardır. Aynı zamanda pratik değildir (de mümkün, ama oldukça çirkin - sadece sütunları, null yapmak), değişken uzunlukta dizileri ile çalışmak.

İkinci yöntemde, herhangi bir uzunlukta dizileri var, ama sadece bir tür olabilir. Sen, elbette, tek tip varchar ya da bir şey ve dizinin öğeleri serialize yapabilirsiniz. Değil iyi yapmak bir şey, ama kesinlikle daha iyi, tüm dizi seri hale daha, değil mi?

Her iki şekilde de, bu yöntemlerden herhangi dizisinin keyfi bir öğesine erişmek için ve dizileri ve bunun gibi çirkin şeyler serileştirmesi endişelenmenize gerek yok olmanın açık bir avantaj olur.

Onu geri almak için gibi. Eh, bir sorgu ile satır uygun satır / dizisi olsun, iyi, doğru .. bir loop kullanabilir?

Sadece serialize PHP işlevini kullanın:

<?php
$myArray = new array('1', '2');
$seralizedArray = serialize($myArray);
?>

Böyle basit dizileri kullanıyorsanız Ancak siz de çöktüğünü kullanımı ve patlayabilir.

Ben kendime buldum iyi yolu, ayırıcı karakterler ile veri dizesi dizi tasarruf olduğunu

$array = array("value1", "value2", "value3", "...", "valuen");
$array_data = implode("array_separator", $array);

$query = "INSERT INTO my_tbl_name (id, array_data) VALUES(NULL,'" . $array_data . "');";

Daha sonra basit bir sorgu ile dizide saklanan verileri, arama yapabilirsiniz

$query = "SELECT * FROM my_tbl_name WHERE array_data LIKE '%value3%'";

Diziye dize "array_data" dönüştürmek için () işlevini kullanın patlayabilir

$array = explode("array_separator", $array_data);

Bu çok boyutlu dizilerle çalışma olduğunu unutmayın ve "array_separator" benzersiz ve dizi değerleri var olmasaydı emin olun.

Be careful !!! if you just will take a form data and put in database, you will be in trap, becous the form data isn't SQL-safe ! you must handle your form value with mysql_real_escape_string or if you use MySQLi mysqli::real_escape_string or if value are integer or boolean cast (int) (boolean) on them

$number = (int)$_POST['number'];
$checked = (boolean) $_POST['checked'];

$name = mysql_real_escape_string($db_pt, $_POST['name']);
$email = mysqli_obj->real_escape_string($_POST['email']);

Daha önce de belirtildiği gibi - dizi içinde veri aramak gerek yoksa, serialize kullanabilirsiniz - ancak bu "sadece php" dir. Performans için değil, aynı zamanda taşınabilirlik için değil sadece - Yani json_decode / json_encode kullanmak için tavsiye ederim!

Serialize ve unserialize bunun için oldukça yaygındır. Ayrıca daha az PHP özgü biçimi için json_encode ve json_decode üzerinden JSON kullanabilirsiniz.

Ben çöktüğünü / sen tek tek dizi herhangi bir öğe yer olmayacak biliyorum bir karakter ile patlayabilir kullanarak öneririm. Sonra bir dize olarak SQL saklayın.

değerleri bir dizi olduğundan, bir tabloya değerler ekler bir mysql sorgusuna dizinin değerlerini koymak istiyorum, implode işlevini kontrol edin.

$query = "INSERT INto hardware (specifications) VALUES (".implode(",",$specifications).")";

Dizideki değerler metin değerleri iseniz, tırnak eklemeniz gerekir

$query = "INSERT INto hardware (specifications) VALUES ("'.implode("','",$specifications)."')";

mysql_query($query);

Yinelenen değerleri istemiyorsanız Ayrıca, "IGNORE" için "yerine" geçiş ve yalnızca benzersiz değerler tabloya eklenecektir.

DB depolama için serialize / unserialize dizi

Yazarın http://php.net/manual/en/function.serialize.php

PHP Manual:

Sayfasındaki "dön" altına bakın

Her yerde saklanabilir değerin bayt dizisi gösterimini içeren bir dize döndürür.

Bu null byte içerebilir ikili bir dizedir ve depolanır ve gibi ele alınması gerektiğini unutmayın. Örneğin, serialize () çıkış genellikle yerine CHAR veya metin alanı daha, bir veritabanındaki bir BLOB alanda saklanmalıdır.

Not: Eğer bir damla içine html saklamak istiyorsanız, base64 kodlamak veya serialize fonksiyonunu kırılabilir emin olun.

Example encoding: $YourSerializedData = base64_encode(serialize($theHTML)); $YourSerializedData is now ready to be stored in blob.

After getting data from blob you need to base64_decode then unserialize Example decoding: $theHTML = unserialize(base64_decode($YourSerializedData));

Evet, seri / unserialize birçok açık kaynak projelerde en gördüğüm budur.

Bunun yerine veritabanına kaydederek, bir dosyaya kaydedebilir ve daha sonra diyoruz.

What many php apps do (like sugarcrm) is to just use var_export to echo all the data of the array to a file. This is what I use to save my configurations data:

private function saveConfig() {
    file_put_contents($this->_data['pathtocompileddata'],'<?php' . PHP_EOL . '$acs_confdata = ' . var_export($this->_data,true) . ';');        
}

Ben bu verileri kaydetmek için daha iyi bir yol olduğunu düşünüyorum!