Classe post

Répondre
jackbocar
le 06/08/2009 à 18:57
jackbocar
Est-il possible de poster des données avec un formulaire avec ce code :


<?php
public function dbInsert($table, $values)
{
$this->conn();

$fieldnames = array_keys($values[0]);

$size = sizeof($fieldnames);
$i = 1;
$sql = "INSERT INTO $table";

$fields = '( ' . implode(' ,', $fieldnames) . ' )';

$bound = '(:' . implode(', :', $fieldnames) . ' )';

$sql .= $fields.' VALUES '.$bound;


$stmt = $this->db->prepare($sql);
foreach($values as $vals)
{
$stmt->execute($vals);
}
}
?>




Mon code d'insertion :

<?php
$values = array(
array('animal_name'=>'bruce', 'animal_type'=>'dingo'),
array('animal_name'=>'bruce', 'animal_type'=>'wombat'),
array('animal_name'=>'bruce', 'animal_type'=>'kiwi'),
array('animal_name'=>'bruce', 'animal_type'=>'kangaroo')
);

$crud->dbInsert('animals', $values);
?>


Ou est-il possible de créer une classe pour poster $POST_[' '] avec ce même code.

Jack Bocar
moogli
le 10/08/2009 à 20:47
moogli
salut,

ne connaissant pas trop mysqli je ne peut pas trop me prononcer mais :
- il manque un espace entre le nom de la table est le INTO (dans ton cas insert INTOanimals)

ensuite d'après la doc execute ne prend pas de paramètre (sauf en procédural mais dans ce cas prend une ressource mysqli en paramétre).

pour ce qui est des $bound la ne sais pas, peut être plutot utiliser le bind ? mysqli_prepare

@+
Il en faut peu pour être heureux !!!!!
moogli
le 10/08/2009 à 21:08
moogli
et comme j'aime bien aller jusqu'au bout :
php
<?php
function dbInsert($table, $values)
{
//$this->conn();
$mysqli = new mysqli('localhost', 'root', '', 'jack');


$fieldnames = array_keys($values[0]);

$size = sizeof($fieldnames);
$i = 1;
$sql = 'INSERT INTO '.$table;

$fields = '( ' . implode(' ,', $fieldnames) . ' )';


$sql .= $fields.' VALUES ( ? , ?)';

$stmt = $mysqli->prepare($sql);

foreach($values as $vals)
{
$stmt->bind_param('ss',$vals['animal_name'],$vals['animal_type']);
$stmt->execute();
printf("%d ligne insérée.\n", $stmt->affected_rows);

}
$stmt->close();
$mysqli->close();
}


$values = array(
array('animal_name'=>'bruce', 'animal_type'=>'dingo'),
array('animal_name'=>'bruce', 'animal_type'=>'wombat'),
array('animal_name'=>'bruce', 'animal_type'=>'kiwi'),
array('animal_name'=>'bruce', 'animal_type'=>'kangaroo')
);

dbInsert('animals', $values);

?>


résultat
1 ligne insérée.
1 ligne insérée.
1 ligne insérée.
1 ligne insérée.

---
mysql> select * from animals;
+----+-------------+-------------+
| id | animal_name | animal_type |
+----+-------------+-------------+
| 1 | bruce | dingo |
| 2 | bruce | wombat |
| 3 | bruce | kiwi |
| 4 | bruce | kangaroo |
+----+-------------+-------------+
4 rows in set (0.00 sec)

mysql>


code a ne pas utiliser direct je l'ai adapter pour ne pas utiliser de classe pour le test mais ça fonctionne pareil ;)

@+

Humf marche pas avec php 5.2.10 => mysqli_stmt::bind_param() [<a href='mysqli-stmt.bind-param'>mysqli-stmt.bind-param</a>]: Number of variables doesn't match number of parameters in prepared statement
O_o

5.0.2 ok
Il en faut peu pour être heureux !!!!!
jackbocar
le 13/08/2009 à 16:48
jackbocar
Bonjour,

Merci de ta réponse et des tests que tu as fait.
Effectivement, ça fonctionne très bien.
Je vais tester avec mysqli_prepare.

Maintenant, peux-tu me dire comment changer array_keys pour que ça fonctionne avec un formulaire et $_POST.

En fait ce qui m'intéresse dans ce code s'est de pouvoir l'utiliser sans être obligé de donner un nom de table, le fait d'avoir $table et $values, dans cette classe est très utile. Mais je n'ai pas trouvé de code équivalent pour adapter ce code pour qu'il fonctionne avec un formulaire.

Je me suis acheté le livre : Php - Mysql - Mysqli - Pdo (sortie en 2009) en pensant pouvoir adapter ce bout de code. Je n'ai pas trouvé de solution.

Merci

Jack Bocar
moogli
le 13/08/2009 à 23:35
moogli
ben le truc c'est que soit tu est certain des champs et du contenu de $_POST soit tu test.

Perso je garderais array_key, si tu souhaite garder la requete totalement "libre" de contraintes.

mais tu peut aussi passer en $value un tableau du genre
php
<?php
$value = array (array ('nomchamp1', 'nomchamp2' ), array ('value1', 'value2', 'value3' ) );
?>

tu peut nommer les champ (genre le 1er tableau champ et le 2ème value, tu test si $value['champs'] et $value['values'] existe ET s'ils sont bien des tableaux (et qu'ils ont la même taille).

A partir de la tu peut te passer de array_key puisse que les champs sont dans le tableau et nom en en clef du tableau.

dans ce cas juste l'implode pour la construction de la requête et zou.

Par contre si plusieurs requete en même temps (donc une dimension de plus dans le tableau) il te faudra construire complètement la requête dans le foreach.

n'utilise surtout pas $_POST dans la classe (c'est possible) car cela t'empêcherais de pouvoir l'utiliser dans d'autre contexte ;).

essai et si t'a des soucis demande ;)

@+
Il en faut peu pour être heureux !!!!!
Répondre

Ecrire un message

Votre message vient d'être créé avec succès.
LoadingChargement en cours