4 votes

Comment ce PHP sait-il quelle clé/valeur de tableau utiliser ?

J'ai supprimé environ 80 % de son code, tout le code sans rapport avec ma question a été supprimé et il ne reste que la quantité qui me permet de tester cette classe sans toucher à une vraie base de données.

Cette classe possède quelques méthodes qui vous permettent de définir une clé et une valeur, puis de les transformer en une requête sql mysql UPDATE et INSERT en utilisant un tableau. J'essaie de comprendre comment utiliser ce code à 100% afin de pouvoir utiliser cette fonctionnalité pour les UPDATE et INSERTS dans ma propre application.

En gros, d'après ce que j'ai compris, vous faites quelque chose comme ça...

// assign some key/values to insert into DB
$db->assign('name', 'dfgd');
$db->assign('age', 87);
$db->assign('sex', 'female');
$db->assign('user_id', 4556);

// Do  the insert
$db->insert('testing2');

Là où je suis confus, c'est que je peux continuer à exécuter un code comme celui-ci encore et encore sur la page et il utilisera toujours le jeu correct de tableaux de clés/valeurs. Ci-dessus, vous pouvez voir que j'ai utilisé la méthode assign() 4 fois et que j'ai ensuite appelé la méthode insert() qui crée ceci

INSERT INTO test (name, age, sex, user_id) VALUES (jason davis, 26, male, 5345)

Maintenant si je fais un autre jeu comme ça sur la même page...

// assign some key/values to insert into DB
$db->assign('name', 'dfgd');
$db->assign('age', 87);
$db->assign('sex', 'female');
$db->assign('user_id', 4556);

// Do  the insert
$db->insert('testing2');

Il crée ensuite ce...

INSERT INTO testing2 (name, age, sex, user_id) VALUES (dfgd, 87, female, 4556)

Comment ne pas combiner les deux ensembles de 4, de sorte qu'au lieu d'insérer 8 enregistrements lors de la deuxième insertion, il remplace complètement le premier ensemble de 4 valeurs par le nouvel ensemble. C'est génial et c'est ce que je veux, mais je ne comprends pas comment cela se passe ? Peut-on l'améliorer de toute façon ?

Vous trouverez ci-dessous une classe complète et mon code de démonstration, il peut être exécuté sans avoir besoin de se connecter à mysql pour cette démo, il imprimera à l'écran le SQL qu'il construit.

De plus, où se trouve le fonction publique reset() dans le code ci-dessous doit être utilisé à, ou ne serait-il pas nécessaire ?

<?php 
class DB{
    public $fields;

    public function assign($field, $value){
        $this->fields[$field] = ($value)==""?("'".$value."'"):$value;
    }

    public function assign_str($field, $value){
        $this->fields[$field] = "'".addslashes($value)."'";
    }

    public function reset(){
        $this->fields = array();
    }

    public function insert($table){
        $f = "";
        $v = "";
        reset($this->fields);
        foreach($this->fields as $field=>$value){
            $f.= ($f!=""?", ":"").$field;
            $v.= ($v!=""?", ":"").$value;
        }
        $sql = "INSERT INTO ".$table." (".$f.") VALUES (".$v.")";
        //print SQL to screen for testing
        echo $sql;
        //$this->query($sql);
        return $this->insert_id();
    }

    public function update($table, $where){
        $f = "";
        reset($this->fields);
        foreach($this->fields as $field=>$value){
            $f.= ($f!=""?", ":"").$field." = ".$value;
        }
        $sql = "UPDATE ".$table." SET ".$f." ".$where;
        echo $sql;
        //$this->query($sql);
    }

    public function query($_query){
        $this->query = $_query;
        $this->result = @mysql_query($_query, $this->link_id) or die( $_query."<p>".mysql_error($this->link_id) );
        return $this->result;
    }

    public function insert_id(){
        return @mysql_insert_id($this->link_id);
    }
}

// start new DB object
$db = new DB;

// assign some key/values to insert into DB
$db->assign('name', 'jason davis');
$db->assign('age', 26);
$db->assign('sex', 'male');
$db->assign('user_id', 5345);

// Do  the insert
$db->insert('test');

echo '<hr />';

// assign some key/values to insert into DB
$db->assign('name', 'dfgd');
$db->assign('age', 87);
$db->assign('sex', 'female');
$db->assign('user_id', 4556);

// Do  the insert
$db->insert('testing2');

echo '<hr />';

// assign some key/values to UPDATE the DB
$db->assign('name', 'jason davis');
$db->assign('age', 26);
$db->assign('sex', 'male');
$db->assign('user_id', 5345);

// DO the DB UPDATE
$db->update('blogs', 'WHERE user_id = 23');

?>

2voto

Les clés des tableaux associatifs sont uniques ; l'attribution d'une nouvelle valeur efface l'ancienne.

2voto

Donny Kurnia Points 3565

Si vous êtes toujours à la recherche d'une autre bibliothèque d'abstraction de base de données, je vous suggère d'utiliser la bibliothèque suivante AdoDB . Il peut se connecter à plusieurs bases de données, donc votre code restera le même si vous décidez de changer de base de données plus tard. Il a une fonction intégrée pour nettoyer les données avant l'insertion/mise à jour.

Pour votre code ci-dessus, lorsque vous utilisez AdoDB, vous l'écrirez comme ceci :

$adodb =& ADONewConnection($dsn);
$data['name'] = 'dfgd';
$data['age'] = 87;
$data['sex'] = 'female';
$data['user_id'] = 4556;

// Do  the insert
$result = $adodb->AutoExecute($table_name, $data, 'INSERT');

//If update, must have one of the key, such as id column
$result = $adodb->AutoExecute($table_name, $data, 'UPDATE', "id=$id");

Vous pouvez lire la documentation sur le site, ou dans le fichier zip que vous pouvez télécharger. J'utilise toujours cette bibliothèque dans tous mes projets, même si je la préfère à la bibliothèque de base de données intégrée à CodeIgniter.

0voto

Tyler Carter Points 30030

Ok, nous sommes arrivés à la conclusion que ma réponse précédente était juste :


Comme vous utilisez les clés de nom, il remplace les anciennes clés par les nouvelles.

$db->assign('user_id', "1");

fait essentiellement ça :

$this->fields['user_id] = (1)==""?("'1'"):1;

Et quand tu dois le refaire, ça remplace

$this->fields['user_id'] = (2)==""?("'2'"):2;

Essayez de faire une assignation, puis réassignez seulement l'user_id, le reste des données restera le même.


Pour résoudre ce problème, nous appellerions le $this->reset() après une requête.

public function query($_query){
        $this->query = $_query;
        $this->result = @mysql_query($_query, $this->link_id) or die( $_query."<p>".mysql_error($this->link_id) );
        $this->reset();
        return $this->result;
    }

ou vous pouvez l'appeler dans l'individu insert o update fonctions :

public function insert($table){
    // .... stuff
    $this->query($sql);
    $this->reset();
    return $this->insert_id();
}

L'autre possibilité est que le programmeur d'origine ne vous a pas suffisamment transmis ses intentions. Il pourrait s'attendre à ce que vous appeliez $db->reset() après chaque requête.

0voto

Alix Axel Points 63455

insert() y update() devrait (à l'origine) définir le $this->fields en un tableau vide lors de l'exécution, mais vous avez en quelque sorte (à tort) supprimé ce code ?

Mettez votre code à jour comme ceci :

    public function insert($table){
        $f = "";
        $v = "";
        foreach($this->fields as $field=>$value){
            $f.= ($f!=""?", ":"").$field;
            $v.= ($v!=""?", ":"").$value;
        }
        $sql = "INSERT INTO ".$table." (".$f.") VALUES (".$v.")";
        $this->reset();
        //print SQL to screen for testing
        echo $sql;
        //$this->query($sql);
        return $this->insert_id();
    }

    public function update($table, $where){
        $f = "";
        foreach($this->fields as $field=>$value){
            $f.= ($f!=""?", ":"").$field." = ".$value;
        }
        $sql = "UPDATE ".$table." SET ".$f." ".$where;
        $this->reset();
        echo $sql;
        //$this->query($sql);
    }

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