tutorial simple application php mysql pdo mysqli

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.