03-08-2009, 02:08 AM
pardonnez moi d'avance, j'essairait d'etre aussi clair que possible. J'ai crée cette classe parce que j'avais eu du mal avec la POO melangé au SQL. c'est peut-etre sévèrement trash. mais ça marche pas trop mal sur mon serveur et ça rends la vie beucoup plus facile.
ce code se montre particulièrement utile. surtout au niveau d'un admin souple et rapide à mettre en place . mais il ne vous degage pas d'un vrai travail de programmation.
le constructeur avec en param le nom de la table...
comme j'ai un peu de mal avec __construct( ) - sans doute le __ qui me gene - j'utilise la répétition du nom de classe
la methode get permet de recuperer l'objet specifique sur lequel on veut travailler...
le boucles dans les methodes insert et update permettent de former de requetes nettoyé de toutes erreurs de variabbles
on doit aussi pouvoir effacer
la methode select ne porte pas sur un enregistrement mais sur un ou plusieurs. vous fixer la condition, comme une requete normale et on vous retourne les enregistrement sous un array.
getChamps permet de controler l'existence d'un champs.
set permet de modifier sa valeur via l'objet si vous ne preferez pas le faire en dur dans le code.
la fonction add retourne un tableau d'enregistrement. avec des champs de saisie formés selon le type des données.
la fonction edit retourne un tableau d'edition d'un enregistrement. avec des champs de saisie formés selon le type des données.
la fonction inspect fourni un tableau des enregistrement avec un lien vers une page d'ajout/edition ou un mode de suppressio
voila ce que ça donne à l'utilisation
on peut alors facilement modifier la boucle d'affichage si un des champs de saisie automatique ne convient finalement pas à vos besoin
si vous avez des critiques ou des conseils pour ameliorer ce code( peut-etre au niveau securité, ou autre ...) je suis pret à tout entendre...
ce code se montre particulièrement utile. surtout au niveau d'un admin souple et rapide à mettre en place . mais il ne vous degage pas d'un vrai travail de programmation.
Code PHP :
//!\attention on demarre
class sql
{
le constructeur avec en param le nom de la table...
comme j'ai un peu de mal avec __construct( ) - sans doute le __ qui me gene - j'utilise la répétition du nom de classe
Code PHP :
function sql($table )
{
$this->table = $table ;
$sql ="describe ".$this->table." ;" ;
$infos = mysql_query($sql) ;
while($donnees = mysql_fetch_array($infos))
$tab_donnees[] = $donnees;
foreach($tab_donnees as $data => $club)
{
//on recupere le nom et la valeur par deffaut
$titre = $club["Field"];
$value = $club["Default"];
// on crée la variable d'objet
$this->$titre = $value;
}
}
la methode get permet de recuperer l'objet specifique sur lequel on veut travailler...
Code PHP :
public function get($id , $field="")
{
$donnees = array();
if($field=="") $field = "id";
$this->$field = $id;
$sql ="SELECT * FROM `".$this->table."` WHERE $field='$id'" ;
$infos = mysql_query($sql) ;
$donnees = mysql_fetch_array($infos);
if(!empty($donnees))
{
foreach($donnees as $name => $value)
{
if(!is_numeric($name)) $this->$name = $value ;
}
return true;
}
else return false ;
}
le boucles dans les methodes insert et update permettent de former de requetes nettoyé de toutes erreurs de variabbles
Code PHP :
public function insert()
{
foreach ($this as $name => $value)
{
if($name != "table" )
{
$into .= ",`$name`" ;
$values .= ",'$value'";
}
}
$into = ltrim($into,",");
$values = ltrim($values,",");
// ltrim pour eliminer les virgules en trop.
$sql = "insert into ".$this->table." ($into) values ($values)";
$infos = mysql_query($sql);
return mysql_insert_id();//LAST_INSERT_ID() ;
}
public function update()
{
foreach ($this as $name => $value)
{
if( $name!="id" and $name != "table" )$set .= ",`$name` = '$value'" ;
}
$set = ltrim($set, ",");
// ltrim pour eliminer les virgules en trop.
$sql ="update `".$this->table."` set $set where `id` = '".$this->id."' ";
$infos = mysql_query($sql)or die( $sql."\n<br />\n impossible d'executer la reqete : \n<br />\n ".mysql_error() ) ;
//print "<p>$sql</p>";
return $this->id;
}
on doit aussi pouvoir effacer
Code PHP :
public function delete($id="")
{
if($id=="")$id = $this->id ;
$sql ="delete from `".$this->table."` where `id` = '".$id."' ";
$infos = mysql_query($sql) ;
}
la methode select ne porte pas sur un enregistrement mais sur un ou plusieurs. vous fixer la condition, comme une requete normale et on vous retourne les enregistrement sous un array.
Code PHP :
public function select($condition="")
{
$donnees = array();
$result = array();
$sql ="SELECT * FROM `".$this->table."` $condition " ;
//print "<p>$sql</p>";
$infos = mysql_query($sql) ;
while($donnees = mysql_fetch_array($infos))
{
$result[] = $donnees ;
}
return $result ;
}
getChamps permet de controler l'existence d'un champs.
set permet de modifier sa valeur via l'objet si vous ne preferez pas le faire en dur dans le code.
Code PHP :
public function getChamps($champs)
{
$retour = false;
foreach( $this as $field => $val)
{
if($field == $champs ) $retour = true;
}
return $retour ;
}
public function set($champs, $value)
{
$this->$champs = $value ;
}
la fonction add retourne un tableau d'enregistrement. avec des champs de saisie formés selon le type des données.
Code PHP :
public function add()
{
$array_edit = array();
$sql ="describe ".$this->table." ;" ;
$infos = mysql_query($sql);
$array_edit["form_init"] = '<form method="post" >';
$array_edit["table_init"] = '<table>';
$array_edit["caption"] = '<caption><h1>'.$this->table.'</h1></caption>';
while($donnees = mysql_fetch_array($infos))
{
if(eregi('varchar',$donnees["Type"]))
$array_edit[$donnees["Field"]] .= '<tr>
<td>'.$donnees["Field"].'</td>
<td><input type="text" name="'.$donnees["Field"].'" /></td></tr>';
if(eregi('int',$donnees["Type"]))
{
if($donnees["Field"]!="id")
$array_edit[$donnees["Field"]] = '<tr>
<td>'.$donnees["Field"].'</td>
<td><input type="text" size="2" name="'.$donnees["Field"].'" /></td>
</tr>';
}
if(eregi('decimal',$donnees["Type"]))
$array_edit[$donnees["Field"]] = '<tr>
<td>'.$donnees["Field"].'</td>
<td><input type="text" size="2" name="'.$donnees["Field"].'" /></td>
</tr>';
if(eregi('text',$donnees["Type"]))
$array_edit[$donnees["Field"]] = '<tr>
<td>'.$donnees["Field"].'</td>
<td><textarea name="'.$donnees["Field"].'"></textarea></td>
</tr>';
}
$array_edit["submit"] = '<tr><td></td><td><input type="submit" name="add" /></td></tr>';
$array_edit["table_close"] = '</table>';
$array_edit["form_close"] = '</form>';
return $array_edit;
}
la fonction edit retourne un tableau d'edition d'un enregistrement. avec des champs de saisie formés selon le type des données.
Code PHP :
public function edit($id)
{
$array_edit = array();
$this->get($id);
$sql ="describe ".$this->table." ;" ;
$infos = mysql_query($sql) ;
$array_edit["form_init"] = '<form method="post" >';
$array_edit["table_init"] = '<table>';
$array_edit["caption"] = '<caption><h1>'.$this->table.'</h1></caption>';
while($donnees = mysql_fetch_array($infos))
{
if(eregi('varchar',$donnees["Type"]))
$array_edit[$donnees["Field"]] = '<tr>
<td>'.$donnees["Field"].'</td>
<td><input type="text" name="'.$donnees["Field"].'" value="'.$this->$donnees["Field"].'" /></td>
</tr>';
if(eregi('int',$donnees["Type"]))
$array_edit[$donnees["Field"]] = '<tr>
<td>'.$donnees["Field"].'</td>
<td><input type="text" size="2" name="'.$donnees["Field"].'" value="'.$this->$donnees["Field"].'" /></td>
</tr>';
if(eregi('text',$donnees["Type"]))
$array_edit[$donnees["Field"]] = '<tr>
<td>'.$donnees["Field"].'</td>
<td><textarea name="'.$donnees["Field"].'">'.$this->$donnees["Field"].'</textarea></td>
</tr>';
if(eregi('decimal',$donnees["Type"]))
$array_edit[$donnees["Field"]] = '<tr>
<td>'.$donnees["Field"].'</td>
<td><input type="text" size="2" name="'.$donnees["Field"].'" value="'.$this->$donnees["Field"].'" /></td>
</tr>';
}
$array_edit["submit"] = '<tr><td></td><td><input type="submit" name="mod" /></td></tr>';
$array_edit["table_close"] = '</table>';
$array_edit["form_close"] = '</form>';
return $array_edit;
}
la fonction inspect fourni un tableau des enregistrement avec un lien vers une page d'ajout/edition ou un mode de suppressio
Code PHP :
function inspect($condition="" , $url)
{
$table = $this->select($condition);
$array_edit["table_init"] = '<table>';
$array_edit["caption"] = '<caption><h1>'.$this->table.'</h1></caption>';
$array_edit["th"] .= "<tr>";
foreach ($this as $name => $value)
{
if( $name != "table" ) $array_edit["th"] .= "<th>$name</th>";
}
$array_edit["th"] .= "</tr>";
foreach( $table as $ligne )
{
$array_edit[$ligne["id"]] .= "<tr>";
foreach ( $ligne as $i => $piks ){
// nettoyage des chaines...
$piks = ereg_replace("<[^>]*>", "", trim(strip_tags($piks)) ) ;
if(strlen($piks)>=50)
$piks = substr($piks, 0, 50)."...";
if(!is_numeric($i))
$array_edit[$ligne["id"]] .= "<td>".$piks."</td>";
}
$array_edit[$ligne["id"]] .= "<td>
<a href='".$url."ordre=edit&table=".$this->table."&id=".$ligne["id"]."' >
<img src='".$url."/images/edit.jpg' alt='".$ligne["id"]."' />
</a>
</td>";
$array_edit[$ligne["id"]] .= "<td>
<a href='".$url."ordre=delete&table=".$this->table."&id=".$ligne["id"]."' >
<img src='".$url."/images/delete.gif' alt='".$ligne["id"]."' />
</a>
</td>";
$array_edit[$ligne["id"]] .="</tr>";
}
$array_edit["nouveau"] = "<tr>
<td>nouveau</td>
<td>
<a href='".$url."ordre=edit&table=".$this->table."' >
<img src='".$url."/images/ajout.jpg' alt='".$ligne["id"]."' />
</a>
</td>
</tr>";
$array_edit["table_close"] = '</table>';
return $array_edit;
}
voila ce que ça donne à l'utilisation
Code PHP :
$data = new sql($['nom_table']);
if(isset($['edit'])){
if(isset($['id'])) $ruch = $data->edit($['id']);
else $ruch = $data->add();
}
else {
$condition ="";
$ruch = $data->inspect($condition , "www.monsite.fr/?page=admin&" );
}
foreach ($ruch as $casque => $borderline)
{
print $borderline ;
}
on peut alors facilement modifier la boucle d'affichage si un des champs de saisie automatique ne convient finalement pas à vos besoin
Code PHP :
if($data->table=="joueur" and $casque=="password")
{
print "<tr><td class='".$test->fieldError($casque,"fieldreq")."' >".$casque."</td><td>";
print "<input readonly disabled name='".$casque."' value='".$data->password."' />"; //_r($val);
print "</td></tr>";
}
else print $borderline ;
si vous avez des critiques ou des conseils pour ameliorer ce code( peut-etre au niveau securité, ou autre ...) je suis pret à tout entendre...