simple - PHP: mysql v mysqli v pdo
pdo mysql (3)
He estado leyendo algunas preguntas sobre el uso de mysqli versus pdo para usar mysql en php.
He visto preguntas como mysqli o DOP: ¿cuáles son los pros y los contras? o ¿ Pasando de mysql a mysqli o pdo? , que ambos tratan con mysqli v pdo exclusivamente. No me interesa tanto cuál de estos dos métodos es mejor.
Me preguntaba por qué deberían evitarse las funciones mysql_ Por supuesto, están en proceso de ser desaprobados por la documentación de PHP http://php.net/manual/en/faq.databases.php#faq.databases.mysql.deprecated , el subproceso PHP DOP y MySQLi sugiere DOP y MySQLi es más poderoso y el hilo ¿Cuál es la diferencia entre MySQL, MySQLi y PDO? implica que estos nuevos métodos son más seguros.
En general, me pregunto cuáles son las grandes debilidades de los métodos mysql_ y qué razones existen para evitarlo (supongo que más específicamente que simplemente porque está en desuso). Estoy planeando actualizar mis scripts afectados, y sentí curiosidad por saber por qué este antiguo método estaba en desuso.
¡Gracias!
Bueno, en primer lugar, las funciones mysql son extremadamente propensas a la inyección de SQL si no desinfecta correctamente la entrada manualmente. mysqli y pdo tienen opciones de sentencias SQL parametrizadas evitando este riesgo. En general, también tienen un mejor estilo de codificación en mi opinión.
De Elegir MySSQL API @ PHP.net :
// mysqli
$mysqli = new mysqli("example.com", "user", "password", "database");
$result = $mysqli->query("SELECT ''Hello, dear MySQL user!'' AS _message FROM DUAL");
$row = $result->fetch_assoc();
echo htmlentities($row[''_message'']);
// PDO
$pdo = new PDO(''mysql:host=example.com;dbname=database'', ''user'', ''password'');
$statement = $pdo->query("SELECT ''Hello, dear MySQL user!'' AS _message FROM DUAL");
$row = $statement->fetch(PDO::FETCH_ASSOC);
echo htmlentities($row[''_message'']);
// mysql
$c = mysql_connect("example.com", "user", "password");
mysql_select_db("database");
$result = mysql_query("SELECT ''Hello, dear MySQL user!'' AS _message FROM DUAL");
$row = mysql_fetch_assoc($result);
echo htmlentities($row[''_message'']);
Crear un objeto, como lo hace mysqli y PDO, es la forma recomendada de escribir cualquier software moderno. El liblary de mysql fue lanzado para PHP versión 2.0 y no ha tenido una reescritura importante desde entonces. PHP 2.0 fue lanzado en 1997, eso debería ser suficiente para explicar por qué no usarlo.
El diseño de la función mysql_query
es tal que debe tener cuidado de evitar todos y cada uno de los datos que está inyectando en ella, y si pierde incluso uno, toda su aplicación puede ser destruida por una herramienta automática de explotación de vulnerabilidades de SQL. .
Tanto mysqli
como PDO admiten marcadores de posición necesarios para garantizar que sus consultas estén a salvo de errores de inyección de SQL. Llamar a mysql_real_escape_string
en todo no solo es tedioso, sino también propenso a errores, y ahí es donde surgen los problemas.
Las funciones mysql
son un producto de los primeros días de PHP y son significativamente más limitadas que las nuevas funciones orientadas a objetos que ofrece mysqli
como opción, o PDO por diseño.
Existen varias buenas razones para usar una de estas dos nuevas interfaces, pero la más importante es que la función mysql_query
es simplemente demasiado peligrosa para usarla en el código de producción. Con él siempre estarás a un error de algunos problemas muy serios.
Hay una razón por la que siguen apareciendo rasgones de bases de datos llenas de contraseñas y números de tarjetas de crédito. Tener un punto de inyección de SQL obvio hace que sea casi demasiado fácil controlar completamente un sitio.