"SET NAMES utf8", PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION ); private $cnx = false; public function setDbConf($db_type, $db_name, $db_user=false, $db_pwd=false, $db_host='localhost', $db_opt=false) { $availableType = array('mysql', 'sqlite', 'pgsql'); $this->type = (in_array($db_type, $availableType)) ? $db_type : false; $this->db = ($db_name!="") ? $db_name : false; $this->user = ($db_user!="") ? $db_user : false; $this->pwd = ($db_pwd!="") ? $db_pwd : false; $this->host = ($db_host!="") ? $db_host : false; if(is_array($db_opt)) $this->opt = $db_opt; $this->dns = false; if($this->type && $this->db) { switch($this->type) { case 'mysql': if(!$this->user) return "miss user"; $this->dns = 'mysql:host='.$this->host.';dbname='.$this->db; break; case 'sqlite': $this->dns = 'sqlite:'.$this->db; break; case 'pgsql': if(!$this->user || $this->pwd) return "miss user & pwd"; $this->dns = 'pgsql:host='.$this->host.';port=5432;dbname='.$this->db.';user='.$this->user.';password='.$this->pwd; break; default: return "miss type"; break; } return true; } return "miss type & db"; } public function connect() { if(!$this->dns) return "no conf"; try { switch($this->type) { case 'mysql': if($this->pwd && $this->opt) $this->cnx = new PDO($this->dns,$this->user,$this->pwd,$this->opt); else if($this->pwd) $this->cnx = new PDO($this->dns,$this->user,$this->pwd); break; case 'sqlite': if(!file_exists(realpath($this->db))) throw new PDOException("the sqlite file does not exists !"); $this->cnx = new PDO($this->dns, '', ''); break; case 'pgsql': $this->cnx = new PDO($this->dns); break; default: return "miss type"; break; }; } catch ( PDOException $e ) { return "Echec de connection à la base de donnée : ".$e->getMessage(); } return true; } public function disconnect() { $this->cnx = null; $this->cnx = false; } public function getTablesList() { $sql = "SHOW TABLES FROM ".$this->db; $r = $this->select($sql); if($r['erreur']!==false) return $r; $result = array(); foreach($r['datas'] as $t) { $result[] = $t[array_key_first($t)]; } return array('datas' => $result, 'erreur' => false, 'sql' => $sql); } public function select($sql,$fetchFisrt=false) { if(!$this->cnx) return array('datas' => array(), 'erreur' => 'no db connection', 'sql' => $this->cnx); $result = array(); $erreur = false; try { $sth = $this->cnx->prepare($sql); if(!$sth) throw new PDOException("PDO error => sth : ".$this->getReadableVar($sth)); $result = $sth->execute(); if(!$result) { $e = $sth->errorInfo(); $erreur = $e[2]; } else { if($fetchFisrt) $result = $sth->fetch(PDO::FETCH_ASSOC); else $result = $sth->fetchAll(PDO::FETCH_ASSOC); } } catch ( PDOException $e ) { $erreur = $e->getMessage(); } return array('datas' => $result, 'erreur' => $erreur, 'sql' => $sql); } public function makeInsertSql($table,$infos,$quote="`") { $sql = "INSERT INTO ".$table." ("; $values = ") VALUES ("; $datas = array(); foreach($infos as $key => $val) { if(is_null($val)) continue; $sql.=$quote.$key.$quote.","; $values.=":".$key.","; if(is_string($val)) $datas[$key] = stripslashes($val); else $datas[$key] = $val; } $sql = substr($sql,0,-1).substr($values,0,-1).")"; return array('sql' => $sql, 'datas' => $datas, 'print_sql' => $this->parms($sql,$datas)); } public function insert($table,$infos,$quote="`") { if(!$this->cnx) return array('result' => false, 'id' => 0, 'erreur' => 'no db connection', 'sql' => ''); $result = array(); $erreur = false; $id = false; // MAKE SQL $sql_datas = $this->makeInsertSql($table,$infos,$quote); $sql = $sql_datas['sql']; $datas = $sql_datas['datas']; // EXEC SQL try { $sth = $this->cnx->prepare($sql); if(!$sth) throw new PDOException("PDO error => sth : ".$this->getReadableVar($sth)); $this->cnx->beginTransaction(); $result = $sth->execute($datas); if(!$result) { $e = $sth->errorInfo(); $erreur = $e[2]; } else { if($this->type == "pgsql") { $id = $sth->fetch(PDO::FETCH_ASSOC); $id = $id['id']; } else $id = $this->cnx->lastInsertId(); } $this->cnx->commit(); } catch ( PDOException $e ) { $erreur = $e->getMessage(); } return array('result' => $result, 'id' => $id, 'erreur' => $erreur, 'sql' => $this->parms($sql,$datas)); } public function makeUpdateSql($table,$infos,$conditions,$quote="`") { $sql = "UPDATE ".$table." SET "; $datas = array(); foreach($infos as $key=>$val) { $sql.=$quote.$key.$quote."=:".$key.", "; if(is_string($val)) $datas[$key] = stripslashes($val); else if(is_null($val)) $datas[$key] = NULL; else $datas[$key] = $val; } $sql = substr($sql,0,-2)." ".$conditions; return array('sql' => $sql, 'datas' => $datas, 'print_sql' => $this->parms($sql,$datas)); } public function update($table,$infos,$conditions,$quote="`") { if(!$this->cnx) return array('result' => false, 'erreur' => 'no db connection', 'sql' => ''); $result = false; $erreur = false; // MAKE SQL $sql_datas = $this->makeUpdateSql($table,$infos,$conditions,$quote); $sql = $sql_datas['sql']; $datas = $sql_datas['datas']; // EXEC SQL try { $sth = $this->cnx->prepare($sql, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY)); if(!$sth) throw new PDOException("PDO error => sth : ".$this->getReadableVar($sth)); $this->cnx->beginTransaction(); $result = $sth->execute($datas); if(!$result) { $e = $sth->errorInfo(); if(!is_null($e[2])) $erreur = $e[2]; else if (!is_null($e[0])) $erreur = $e[0]; else $erreur = $e; } $this->cnx->commit(); } catch ( PDOException $e ) { $erreur = $e->getMessage(); } return array('result' => $result, 'erreur' => $erreur, 'sql' => $this->parms($sql,$datas)); } public function deleteById($id,$table,$id_name_val='id',$quote="`") { // MAKE CONDITION $conditions = "WHERE ".$quote.$id_name_val.$quote."="; if(is_string($id)) $conditions .= "'".stripslashes($id)."'"; else $conditions .= $id; // EXEC SQL return $this->deleteWithCondition($table,$conditions); } public function deleteWithCondition($table,$conditions) { if(!$this->cnx) return array('result' => false, 'erreur' => 'no db connection', 'sql' => ''); $result = false; $erreur = false; // MAKE SQL $sql = "DELETE FROM ".$table." ".$conditions; // EXEC SQL try { $sth = $this->cnx->prepare($sql); if(!$sth) throw new PDOException("PDO error => sth : ".$this->getReadableVar($sth)); $this->cnx->beginTransaction(); $result = $sth->execute(); if(!$result) { $e = $sth->errorInfo(); if(!is_null($e[2])) $erreur = $e[2]; else if (!is_null($e[0])) $erreur = $e[0]; else $erreur = $e; } $this->cnx->commit(); } catch ( PDOException $e ) { $erreur = $e->getMessage(); } return array('result' => $result, 'erreur' => $erreur, 'sql' => $sql); } public function execSql($sql) { if(!$this->cnx) return array('result' => false, 'erreur' => 'no db connection', 'sql' => $sql); $result = false; $erreur = false; try { $this->cnx->beginTransaction(); $result = $this->cnx->exec($sql); if($result!==false) $result = true; else { $e = $this->cnx->errorInfo(); throw new PDOException("PDO error => ".$e[2]); } $this->cnx->commit(); } catch ( PDOException $e ) { $erreur = $e->getMessage(); } return array('result' => $result, 'erreur' => $erreur, 'sql' => $sql); } public function executeSql($sql) { if(!$this->cnx) return array('result' => false, 'erreur' => 'no db connection', 'sql' => $sql); $result = false; $erreur = false; try { $sth = $this->cnx->prepare($sql); if(!$sth) throw new PDOException("PDO error => sth : ".$this->getReadableVar($sth)); $this->cnx->beginTransaction(); $result = $sth->execute(); if(!$result) { $e = $sth->errorInfo(); if(!is_null($e[2])) $erreur = $e[2]; else if (!is_null($e[0])) $erreur = $e[0]; else $erreur = $e; } $this->cnx->commit(); } catch ( PDOException $e ) { $erreur = $e->getMessage(); } return array('result' => $result, 'erreur' => $erreur, 'sql' => $sql); } public function quote($value) { if(!$this->cnx) return false; return $this->cnx->quote($value); } private function parms($string,$data) { $indexed=$data==array_values($data); foreach($data as $k=>$v) { if(is_string($v)) $v="'$v'"; elseif(is_null($v)) $v="NULL"; if($indexed) $string=preg_replace('/\?/',$v,$string,1); else $string=str_replace(":$k",$v,$string); } return $string; } private function afficheArray($array,$echo=false,$indent=20) { if(!is_array($array)) return "NOT AN ARRAY !".(($echo) ? "
" : ""); $htmlTxt = "array("; if(count($array)==0) return "array()"; foreach($array as $key => $val) { $htmlTxt.="
"; $htmlTxt.= (is_string($key)) ? "'".$key."'" : $key; $htmlTxt.= " = "; $htmlTxt.= (is_array($val)) ? $this->afficheArray($val, false, ($indent+20), false) : $this->getReadableVar($val); $htmlTxt.= ","; } $htmlTxt = substr($htmlTxt,0,-8).'
'; $htmlTxt.=")"; if($echo) { echo($htmlTxt."
"); return; } return $htmlTxt; } private function getReadableVar($var) { if(is_array($var)) return $this->afficheArray($var,false,20); elseif(is_bool($var)) return ($var) ? 'true' : false; elseif(is_string($var) && $var=='') return "Ø (empty string)"; elseif(is_string($var)) return "'".$var."'"; elseif(is_null($var)) return 'NULL'; elseif($var instanceof DateTime) return $var->format('d/m/Y - H:i:s'); else return print_r($var,1); } public function dump($destFile) { if($this->type!="mysql") return "Wrong type => ".$this->type; if(!$this->pwd) $command = MYSQLDUMP." -u ".$this->user." ".$this->db." > ".$destFile; else $command = MYSQLDUMP." -u ".$this->user." -p".$this->pwd." ".$this->db." > ".$destFile; die($command); $result = array(); $returnCode = 0; $result = system($command,$returnCode); if($returnCode==0) return true; else return "Une erreur est survenue durant la création dump de la base de données ! (error code : ".$returnCode." - command : ".$command." - result : ".$this->getReadableVar($result).")"; } public function getSqliteTablesList($ignore=true) { $list = array(); $sql = "SELECT `name` FROM sqlite_master WHERE `type`='table'"; $r = $this->select($sql); if(!$r['erreur']) { foreach($r['datas'] as $t) { if(($t['name']!="sqlite_sequence" && $ignore) || !$ignore) $list[] = $t['name']; } } else { $er = "
sql: ".$sql."
error: ".$this->getReadableVar($r['erreur']); return "Une erreur est survenue durant la récupération de la liste tables de le base de données !".$er; } return $list; } } function dumpSQL($db,$user,$pwd,$destFile) { $command = MYSQLDUMP." -u ".$user." -p".$pwd." ".$db." > ".$destFile; $result = array(); $returnCode = 0; $result = system($command,$returnCode); if($returnCode==0) return true; else return "Une erreur est survenue durant la création dump de la base de données ! (error code : ".$returnCode." - command : ".$command." - result : ".$result.")"; } ?>