$sql = 'SELECT ... WHERE id = ' . $x;Si $x es '123ABC', estás haciendo una consulta como 'SELECT ... WHERE c.id = 123ABC', que en SQL es ilegal y debería estar entrecomillada. Además, es malísimo. ¿Qué pasa si $x es '0;DELETE FROM xyz;'?
$sql = "SELECT ... WHERE id = '" . $x . "'"Eso arregla lo de que $x sea '123ABC'. También es un lío por las comillas. Y lo peor es que sigue siendo una porquería. ¿Qué pasa si $x es exactamente "';DELETE FROM xyz;"?
$sql = sprintf("SELECT ... WHERE id = '%s'", mysql_real_escape_string($x));
Lo cual escapará correctamente $x. (Si estás usando la extensión mejorada mysqli, tienes que usar mysqli_real_escape_string en su lugar.) Y esto lo tienes que hacer para cada variable de cadena que quieras pasar, mientras que para cada variable numérica o de coma flotante lo que debes es convertirla con (int) o (float) para asegurarte de que es lo que tiene que ser al concatenarla y de que no tiene otros caracteres.
/**
* Dato global necesario: Función que se necesita para escapar cadenas.
* Configúrala de acuerdo a la base de datos que estás utilizando.
*/
$fdbquote = 'mysql_real_escape_string';
/**
* Devuelve una representación en SQL de una variable. Los números se dejan como están; las cadenas
* se escapan utilizando $fdbquote; null es NULL; los valores booleanos son 0 y 1; las listas se
* convierten en una lista de valores separados por coma, cada uno procesado con var_SQLexport.
*/
function var_SQLexport($v) {
if (is_string($v)) {
return "'" . $GLOBALS['fdbquote']($v) . "'";
} else if (is_null($v)) {
return 'NULL';
} else if (is_bool($v)) {
return $v ? '1' : '0';
} else if (is_array($v)) {
foreach ($v as &$x) {
$x = var_SQLexport($x);
}
return join(',', $v);
} else {
return (string) $v;
}
}
/**
* Devuelve una sentencia de SQL, sustituyendo cada "?" en $s por los parámetros adicionales
* debidamente escapados. P.e. $país = 'España'; $número = 1; SQL('SELECT * FROM T WHERE
* str = ? AND int = ?', $país, $número) devuelve "SELECT * FROM T WHERE str = 'España' AND
* int = 1". No utilizar ? para nombres de tablas y otras cosas de SQL que no han de ser
* entrecomilladas; en tal caso verificar la sanidad de los nombres (nunca deben ser entrados
* por el usuario) y concatenarlos normalmente, quizás utilizando comillas dobles.
*/
function SQL($s /*, ...*/) {
$param = func_get_args();
$i = 1;
return preg_replace('/\?/e', 'var_SQLexport($param[$i++])', $s);
}
| Subject | Views | Written By | Posted |
|---|---|---|---|
| Cómo crear un condicional en consulta en mi caso. | 1919 | Cervantes Saavedra | 10/08/2009 09:01PM |
| Re: Cómo crear un condicional en consulta en mi caso. | 2180 | Miguel Perez | 10/09/2009 01:06AM |
Content reproduced on this site is the property of the respective copyright holders. It is not reviewed in advance by Oracle and does not necessarily represent the opinion of Oracle or any other party.