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 tiny long ');
  18. define('MYSQL_TYPES_DATE', 'datetime timestamp year date time ');
  19. define('MYSQL_TYPES_STRING', 'string blob var_string ');
  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. return false;
  75. }
  76. return $this->mid_consulta; // Si todo salio bien regresa el id de la consulta
  77. }
  78. /**
  79. * Inserta un registro en la DB por cada llave->valor en un arreglo.
  80. * No se debe usar sentencias SQL con esta funcion.
  81. * Para usar sentencias SQL se debe utilizar ejecutarConsulta().
  82. *
  83. * @param mixed $tabla El nombre de la tabla en la BD.
  84. * @param array $datos Arreglo con los campos que se desean insertar $arreglo['campo'] = 'valor'.
  85. * @return string El ID del insert, verdadero si la tabla no tiene un campo auto_increment o false si ocurre un error.
  86. */
  87. public function insertarDeFormulario($tabla, $datos)
  88. {
  89. if (empty($datos)) {
  90. $this->merror = "Debes de pasar un arreglo como parametro.";
  91. return false;
  92. }
  93. $cols = '(';
  94. $sqlValues = '(';
  95. foreach ($datos as $llave=>$valor) {
  96. $cols .= "$llave,";
  97. $tipo_col = $this->obtenerTipoCampo($tabla, $llave); // obtiene el tipo de campo
  98. if (!$tipo_col) {
  99. return false;
  100. } // error!
  101. // determina si se necesita poner comillas al valor.
  102. if (is_null($valor)) {
  103. $sqlValues .= "NULL,";
  104. } elseif (substr_count(MYSQL_TYPES_NUMERIC, "$tipo_col ")) {
  105. $sqlValues .= "$valor,";
  106. } elseif (substr_count(MYSQL_TYPES_DATE, "$tipo_col ")) {
  107. $valor = $this->formatearFecha($valor, $tipo_col); // formatea las fechas
  108. $sqlValues .= "'$valor',";
  109. } elseif (substr_count(MYSQL_TYPES_STRING, "$tipo_col ")) {
  110. $valor = $this->sql_escape($valor);
  111. $sqlValues .= "$valor,";
  112. }
  113. }
  114. $cols = rtrim($cols, ',').')';
  115. $sqlValues = rtrim($sqlValues, ',').')';
  116. // inserta los valores en la DB
  117. $sql = "INSERT INTO $tabla $cols VALUES $sqlValues";
  118. return $this->ejecutarConsulta($sql);
  119. }
  120. /**
  121. * Modifica un registro en la DB por cada llave->valor en un arreglo.
  122. * No se debe usar sentencias SQL con esta funcion.
  123. * Para usar sentencias SQL se debe utilizar ejecutarConsulta().
  124. *
  125. * @param mixed $tabla El nombre de la tabla en la BD.
  126. * @param array $datos Arreglo con los campos que se desean insertar $arreglo['campo'] = 'valor'.
  127. * @param mixed $condicion Es basicame una clausula WHERE (sin el WHERE). Por ejemplo,
  128. * "columna=valor AND columna2='otro valor'" seria una condicion.
  129. * @return string El numero de registros afectados o verdadero si no necesitaba actualizarse el registro.
  130. * Falso si ocurrio algun error.
  131. */
  132. public function modificarDeFormulario($tabla, $datos, $condicion="")
  133. {
  134. if (empty($datos)) {
  135. $this->merror = "Debes de pasar un arreglo como parametro.";
  136. return false;
  137. }
  138. $sql = "UPDATE $tabla SET";
  139. foreach ($datos as $llave=>$valor) {
  140. $sql .= " $llave=";
  141. $tipo_col = $this->obtenerTipoCampo($tabla, $llave); // obtiene el tipo de campo
  142. if (!$tipo_col) {
  143. return false;
  144. } // error!
  145. // determina si se necesita poner comillas al valor.
  146. if (is_null($valor)) {
  147. $sql .= "NULL,";
  148. } elseif (substr_count(MYSQL_TYPES_NUMERIC, "$tipo_col ")) {
  149. $sql .= "$valor,";
  150. } elseif (substr_count(MYSQL_TYPES_DATE, "$tipo_col ")) {
  151. $valor = $this->formatearFecha($valor, $tipo_col); /// formatea las fechas
  152. $sql .= "'$valor',";
  153. } elseif (substr_count(MYSQL_TYPES_STRING, "$tipo_col ")) {
  154. $valor = $this->sql_escape($valor);
  155. $sql .= "$valor,";
  156. }
  157. }
  158. $sql = rtrim($sql, ','); // elimina la ultima coma
  159. if (!empty($condicion)) {
  160. $sql .= " WHERE $condicion";
  161. }
  162. // modifica los valores
  163. return $this->ejecutarConsulta($sql);
  164. }
  165. /**
  166. * Obtiene la informacion sobre un campo usando la funcion mysql_fetch_field.
  167. *
  168. * @param mixed $tabla El nombre de la tabla en la BD.
  169. * @param string $campo El campo del que se desea la informacion.
  170. * @return array Un arreglo con la informacion del campo o false si hay algun error.
  171. */
  172. public function obtenerTipoCampo($tabla, $campo)
  173. {
  174. $r = $this->mid_conexion->query("SELECT $campo FROM $tabla");
  175. if (!$r) {
  176. $this->merror = $this->mid_conexion->errorInfo();
  177. return false;
  178. }
  179. $ret = $r->getColumnMeta(0);
  180. if (!$ret) {
  181. $this->merror = "Field information cannot be obtained : ".$tabla.$campo.".";
  182. $r->closeCursor();
  183. return false;
  184. }
  185. $r->closeCursor();
  186. return strtolower($ret['native_type']);
  187. }
  188. /**
  189. * Convierte una fecha en formato para DB.
  190. *
  191. * @param mixed $valor Se le puede pasar un valor timestamp como time() o un string como '04/14/2003 5:13 AM'.
  192. * @return date Fecha para insertar en la BD.
  193. */
  194. public function formatearFecha($valor)
  195. {
  196. if (!preg_match("/^.{4}\-.{2}\-.{2}\ .{2}\:.{2}\:.{2}$/i", $valor)) {
  197. if (preg_match("/^([0-9]+)$/i", $valor)) {
  198. $valor = date("Y-m-d H:i:s", $valor);
  199. } else {
  200. // Estari� en el formato strtotime()
  201. $valor = date("Y-m-d H:i:s", strtotime($valor));
  202. }
  203. }
  204. return $valor;
  205. /* if (gettype($valor) == 'string') $valor = strtotime($valor);
  206. return date('Y-m-d H:i:s', $valor);
  207. */
  208. }
  209. /**
  210. * Obtiene el registro obtenido de una consulta.
  211. */
  212. public function obtenerRegistro()
  213. {
  214. return $this->mid_consulta->fetch(PDO::FETCH_ASSOC);
  215. }
  216. /**
  217. * Devuelve el n�mero de campos de una consulta.
  218. */
  219. public function contarCampos()
  220. {
  221. return $this->mid_consulta->columnCount();
  222. }
  223. /**
  224. * Devuelve el n�mero de registros de una consulta.
  225. */
  226. public function contarRegistros()
  227. {
  228. return @$this->mid_consulta->rowCount();
  229. }
  230. /**
  231. * Devuelve el nombre de un campo de una consulta.
  232. */
  233. public function obtenerNombreCampo($numero_campo)
  234. {
  235. return $this->mid_consulta->getColumnMeta($numero_campo);
  236. }
  237. /**
  238. * Muestra los datos de una consulta (para debug).
  239. */
  240. public function verConsulta()
  241. {
  242. echo "<table border=1>\n";
  243. // mostramos los nombres de los campos
  244. for ($i = 0; $i < $this->contarCampos(); $i++) {
  245. echo "<td><b>".$this->obtenerNombreCampo($i)."</b></td>\n";
  246. }
  247. echo "</tr>\n";
  248. // mostrarmos los registros
  249. while ($row = $this->mid_consulta->fetch(PDO::FETCH_NUM)) {
  250. echo "<tr> \n";
  251. for ($i = 0; $i < $this->contarCampos(); $i++) {
  252. echo "<td>".$row[$i]."</td>\n";
  253. }
  254. echo "</tr>\n";
  255. }
  256. }
  257. /**
  258. * Cierra la conexion a la BD.
  259. */
  260. public function cierraConexion()
  261. {
  262. $this->mid_consulta->closeCursor();
  263. }
  264. public function sql_escape($value)
  265. {
  266. if (get_magic_quotes_gpc()) {
  267. $value = stripslashes($value);
  268. }
  269. if (method_exists("PDO", "quote")) {
  270. $value = $this->mid_conexion->quote($value);
  271. } else {
  272. $value = addslashes($value);
  273. }
  274. return $value;
  275. }
  276. } //fin de la Clase conexion_mysql