A tumblelog CMS built on AJAX, PHP and MySQL.

mysql_connection.class.php 10KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304
  1. <?php
  2. if (!defined('entry') || !entry) {
  3. die('Not a valid page');
  4. }
  5. /**
  6. * version 0.0.1
  7. *
  8. * Clase Conexion_Mysql
  9. *
  10. * @name Manejo de la conexion a la BD.
  11. * @version 0.0.1
  12. * @link http://www.pecesama.net/weblog/
  13. * @copyright MIT Licence
  14. * @author Pedro Santana [pecesama]
  15. */
  16. // constantes
  17. define('MYSQL_TYPES_NUMERIC', 'int real ');
  18. define('MYSQL_TYPES_DATE', 'datetime timestamp year date time ');
  19. define('MYSQL_TYPES_STRING', 'string blob ');
  20. class Conexion_Mysql
  21. {
  22. public $mbase_datos;
  23. public $mservidor;
  24. public $musuario;
  25. public $mclave;
  26. public $mid_conexion = 0; // Identificador de conexi�n
  27. public $mid_consulta = 0; // Identificador de consulta
  28. public $merror_numero = 0; // N�mero de error
  29. public $merror = ""; // Descripci�n del error.
  30. /** Al crear una instancia de clase, se ejecutara esta funcion */
  31. public function __construct($bd="", $host="localhost", $user="", $pass="")
  32. {
  33. $this->mbase_datos = $bd;
  34. $this->mservidor = $host;
  35. $this->musuario = $user;
  36. $this->mclave = $pass;
  37. if (!$this->conectar()) {
  38. $mensaje = "
  39. <h3 class=\"important\">Error establishing a database connection</h3>
  40. <p>This either means that the username and password information in your <code>config.php</code> file is incorrect or we can't contact the database server at localhost. This could mean your host's database server is down.</p>
  41. <ul>
  42. <li>Are you sure you have the correct username and password?</li>
  43. <li>Are you sure that you have typed the correct hostname?</li>
  44. <li>Are you sure that the database server is running?</li>
  45. </ul>";
  46. die($mensaje);
  47. }
  48. }
  49. /** Conectar a la base de datos */
  50. public function conectar()
  51. {
  52. // Conectamos al servidor
  53. try {
  54. $this->mid_conexion = new PDO("mysql:host=$this->mservidor;dbname=$this->mbase_datos;charset=utf8", $this->musuario, $this->mclave);
  55. }
  56. catch (Exception $e) {
  57. $this->merror = $e->getMessage();
  58. return false;
  59. }
  60. return $this->mid_conexion; // Si todo salio bien regresa el id de la conexi�n
  61. }
  62. /** Para ejecutar consultas en la conexi�n abierta */
  63. public function ejecutarConsulta($msql = "")
  64. {
  65. if (empty($msql)) {
  66. $this->merror = "No SQL statement entered";
  67. return false;
  68. }
  69. //ejecutamos la consulta
  70. $this->mid_consulta = $this->mid_conexion->query($msql);
  71. if (!$this->mid_consulta) {
  72. $this->merror_numero = $this->mid_conexion->errorCode();
  73. $this->merror = $this->mid_conexion->errorInfo();
  74. die(var_dump($this->merror));
  75. return false;
  76. }
  77. return $this->mid_consulta; // Si todo salio bien regresa el id de la consulta
  78. }
  79. /**
  80. * Inserta un registro en la DB por cada llave->valor en un arreglo.
  81. * No se debe usar sentencias SQL con esta funcion.
  82. * Para usar sentencias SQL se debe utilizar ejecutarConsulta().
  83. *
  84. * @param mixed $tabla El nombre de la tabla en la BD.
  85. * @param array $datos Arreglo con los campos que se desean insertar $arreglo['campo'] = 'valor'.
  86. * @return string El ID del insert, verdadero si la tabla no tiene un campo auto_increment o false si ocurre un error.
  87. */
  88. public function insertarDeFormulario($tabla, $datos)
  89. {
  90. if (empty($datos)) {
  91. $this->merror = "Debes de pasar un arreglo como parametro.";
  92. return false;
  93. }
  94. $cols = '(';
  95. $sqlValues = '(';
  96. foreach ($datos as $llave=>$valor) {
  97. $cols .= "$llave,";
  98. $tipo_col = $this->obtenerTipoCampo($tabla, $llave); // obtiene el tipo de campo
  99. if (!$tipo_col) {
  100. return false;
  101. } // error!
  102. // determina si se necesita poner comillas al valor.
  103. if (is_null($valor)) {
  104. $sqlValues .= "NULL,";
  105. } elseif (substr_count(MYSQL_TYPES_NUMERIC, "$tipo_col ")) {
  106. $sqlValues .= "$valor,";
  107. } elseif (substr_count(MYSQL_TYPES_DATE, "$tipo_col ")) {
  108. $valor = $this->formatearFecha($valor, $tipo_col); // formatea las fechas
  109. $sqlValues .= "'$valor',";
  110. } elseif (substr_count(MYSQL_TYPES_STRING, "$tipo_col ")) {
  111. $valor = $this->sql_escape($valor);
  112. $sqlValues .= "'$valor',";
  113. }
  114. }
  115. $cols = rtrim($cols, ',').')';
  116. $sqlValues = rtrim($sqlValues, ',').')';
  117. // inserta los valores en la DB
  118. $sql = "INSERT INTO $tabla $cols VALUES $sqlValues";
  119. return $this->ejecutarConsulta($sql);
  120. }
  121. /**
  122. * Modifica un registro en la DB por cada llave->valor en un arreglo.
  123. * No se debe usar sentencias SQL con esta funcion.
  124. * Para usar sentencias SQL se debe utilizar ejecutarConsulta().
  125. *
  126. * @param mixed $tabla El nombre de la tabla en la BD.
  127. * @param array $datos Arreglo con los campos que se desean insertar $arreglo['campo'] = 'valor'.
  128. * @param mixed $condicion Es basicame una clausula WHERE (sin el WHERE). Por ejemplo,
  129. * "columna=valor AND columna2='otro valor'" seria una condicion.
  130. * @return string El numero de registros afectados o verdadero si no necesitaba actualizarse el registro.
  131. * Falso si ocurrio algun error.
  132. */
  133. public function modificarDeFormulario($tabla, $datos, $condicion="")
  134. {
  135. if (empty($datos)) {
  136. $this->merror = "Debes de pasar un arreglo como parametro.";
  137. return false;
  138. }
  139. $sql = "UPDATE $tabla SET";
  140. foreach ($datos as $llave=>$valor) {
  141. $sql .= " $llave=";
  142. $tipo_col = $this->obtenerTipoCampo($tabla, $llave); // obtiene el tipo de campo
  143. if (!$tipo_col) {
  144. return false;
  145. } // error!
  146. // determina si se necesita poner comillas al valor.
  147. if (is_null($valor)) {
  148. $sql .= "NULL,";
  149. } elseif (substr_count(MYSQL_TYPES_NUMERIC, "$tipo_col ")) {
  150. $sql .= "$valor,";
  151. } elseif (substr_count(MYSQL_TYPES_DATE, "$tipo_col ")) {
  152. $valor = $this->formatearFecha($valor, $tipo_col); /// formatea las fechas
  153. $sql .= "'$valor',";
  154. } elseif (substr_count(MYSQL_TYPES_STRING, "$tipo_col ")) {
  155. $valor = $this->sql_escape($valor);
  156. $sql .= "'$valor',";
  157. }
  158. }
  159. $sql = rtrim($sql, ','); // elimina la ultima coma
  160. if (!empty($condicion)) {
  161. $sql .= " WHERE $condicion";
  162. }
  163. // modifica los valores
  164. return $this->ejecutarConsulta($sql);
  165. }
  166. /**
  167. * Obtiene la informacion sobre un campo usando la funcion mysql_fetch_field.
  168. *
  169. * @param mixed $tabla El nombre de la tabla en la BD.
  170. * @param string $campo El campo del que se desea la informacion.
  171. * @return array Un arreglo con la informacion del campo o false si hay algun error.
  172. */
  173. public function obtenerTipoCampo($tabla, $campo)
  174. {
  175. $r = $this->mid_conexion->query("SELECT $campo FROM $tabla");
  176. if (!$r) {
  177. $this->merror = $this->mid_conexion->errorInfo();
  178. return false;
  179. }
  180. $ret = $r->getColumnMeta(0);
  181. if (!$ret) {
  182. $this->merror = "Field information cannot be obtained : ".$tabla.$campo.".";
  183. $r->closeCursor();
  184. return false;
  185. }
  186. $r->closeCursor();
  187. return $ret;
  188. }
  189. /**
  190. * Convierte una fecha en formato para DB.
  191. *
  192. * @param mixed $valor Se le puede pasar un valor timestamp como time() o un string como '04/14/2003 5:13 AM'.
  193. * @return date Fecha para insertar en la BD.
  194. */
  195. public function formatearFecha($valor)
  196. {
  197. if (!preg_match("/^.{4}\-.{2}\-.{2}\ .{2}\:.{2}\:.{2}$/i", $valor)) {
  198. if (preg_match("/^([0-9]+)$/i", $valor)) {
  199. $valor = date("Y-m-d H:i:s", $valor);
  200. } else {
  201. // Estari� en el formato strtotime()
  202. $valor = date("Y-m-d H:i:s", strtotime($valor));
  203. }
  204. }
  205. return $valor;
  206. /* if (gettype($valor) == 'string') $valor = strtotime($valor);
  207. return date('Y-m-d H:i:s', $valor);
  208. */
  209. }
  210. /**
  211. * Obtiene el registro obtenido de una consulta.
  212. */
  213. public function obtenerRegistro()
  214. {
  215. return $this->mid_consulta->fetch(PDO::FETCH_ASSOC);
  216. }
  217. /**
  218. * Devuelve el n�mero de campos de una consulta.
  219. */
  220. public function contarCampos()
  221. {
  222. return $this->mid_consulta->columnCount();
  223. }
  224. /**
  225. * Devuelve el n�mero de registros de una consulta.
  226. */
  227. public function contarRegistros()
  228. {
  229. return @$this->mid_consulta->rowCount();
  230. }
  231. /**
  232. * Devuelve el nombre de un campo de una consulta.
  233. */
  234. public function obtenerNombreCampo($numero_campo)
  235. {
  236. return $this->mid_consulta->getColumnMeta($numero_campo);
  237. }
  238. /**
  239. * Muestra los datos de una consulta (para debug).
  240. */
  241. public function verConsulta()
  242. {
  243. echo "<table border=1>\n";
  244. // mostramos los nombres de los campos
  245. for ($i = 0; $i < $this->contarCampos(); $i++) {
  246. echo "<td><b>".$this->obtenerNombreCampo($i)."</b></td>\n";
  247. }
  248. echo "</tr>\n";
  249. // mostrarmos los registros
  250. while ($row = $this->mid_consulta->fetch(PDO::FETCH_NUM)) {
  251. echo "<tr> \n";
  252. for ($i = 0; $i < $this->contarCampos(); $i++) {
  253. echo "<td>".$row[$i]."</td>\n";
  254. }
  255. echo "</tr>\n";
  256. }
  257. }
  258. /**
  259. * Cierra la conexion a la BD.
  260. */
  261. public function cierraConexion()
  262. {
  263. $this->mid_consulta->closeCursor();
  264. }
  265. public function sql_escape($value)
  266. {
  267. if (get_magic_quotes_gpc()) {
  268. $value = stripslashes($value);
  269. }
  270. if (method_exists("PDO", "quote")) {
  271. $value = $this->mid_conexion->quote($value);
  272. } else {
  273. $value = addslashes($value);
  274. }
  275. return $value;
  276. }
  277. } //fin de la Clase conexion_mysql