93 votes

Enregistrez tableau PHP MySQL?

Ce qui est un bon moyen d'économiser un tableau de données à un seul champ mysql?

Aussi une fois j'ai une requête pour ce tableau dans la table mysql, ce qui est un bon moyen d'obtenir de nouveau dans la matrice de la forme?

Est serialize et unserialize la réponse?

91voto

Peter Lindqvist Points 6812

Il n'y a pas de bonne façon de stocker un tableau dans un seul champ.

Vous devez examiner vos données relationnelles et apporter les modifications appropriées à votre schéma. Voir l'exemple ci-dessous pour référence à cette approche.

Si vous devez enregistrer le tableau en une seule zone, l' serialize() et unserialize() fonctions fera l'affaire. Mais vous ne pouvez pas effectuer des requêtes sur le contenu réel.

Comme une alternative à la fonction de sérialisation il est également json_encode() et json_decode().

Considérons le tableau suivant

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

Pour l'enregistrer dans la base de données, vous devez créer un tableau comme ceci

$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)
    )');

Travailler avec les enregistrements que vous pouvez exécuter des requêtes telles que la ces (et oui c'est un exemple, méfiez-vous!)

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();

L' connect() fonction retourne une ressource de connexion mysql

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

27voto

Matchu Points 37755

Oui, en général, serialize et unserialize sont la voie à suivre.

Si vos données est quelque chose de simple, mais, en économie comme une chaîne délimitée par des virgules serait sans doute mieux pour l'espace de stockage. Si vous savez que votre tableau sera juste une liste de nombres, par exemple, alors vous devriez utiliser implosion/explosion. C'est la différence entre 1,2,3 et a:3:{i:0;i:1;i:1;i:2;i:2;i:3;}.

Si non, alors serialize et unserialize de travail pour tous les cas.

11voto

KramerC Points 601

Suffit d'utiliser la sérialisation fonction PHP:

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

Toutefois, si vous êtes à l'aide de tableaux simples comme ce que vous pourriez aussi bien utiliser d'implosion et d'explosion.

8voto

Harry Points 85

La meilleure façon que j'ai trouvé pour me sauver de la matrice de données chaîne de caractères avec des caractères de séparation

$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 . "');";

Vous pouvez ensuite rechercher les données, stockées dans votre tableau avec un simple requête

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

utiliser explode() de la fonction de conversion "array_data" chaîne de tableau

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

notez que cela ne fonctionne pas avec les tableaux multidimensionnels et assurez-vous que votre "array_separator" est unique et n'avait pas exister dans la gamme des valeurs.

Attention !!! si vous ne pourrez prendre un formulaire de données et les mettre dans la base de données, vous serez dans le piège, becous les données du formulaire n'est pas SQL-sûr ! vous devez gérer votre formulaire de valeur avec mysql_real_escape_string ou si vous utiliser MySQLi mysqli::real_escape_string ou si la valeur sont des entiers ou des booléens cast (int) (booléenne)

$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']);

6voto

Sebastian Lasse Points 21

Comme mentionné avant, Si vous n'avez pas besoin de rechercher des données dans le tableau, vous pouvez utiliser serialize - mais c'est "php". Donc je vous conseille d'utiliser la fonction json_decode / json_encode - non seulement pour les performances, mais aussi pour des raisons de portabilité !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X