php - una - mostrar datos de mysql en formulario html
¿Cuál es la mejor forma de acceder a una base de datos desde PHP? (15)
¿Qué otros patrones hay?
ActiveRecord: puedes ver un ejemplo de esto en CakePHP .
Creo que depende mucho de sus necesidades: si está compilando una aplicación pequeña, probablemente sea más rápido construir una capa de base de datos de bricolaje.
Si está creando una gran aplicación con muchas tablas y relaciones, usar algo como la funcionalidad ActiveRecord de CakePHP probablemente sea más rápido y fácil.
No he usado la capa de abstracción de PEAR todavía, pero también se ve bien. Zend también tiene una biblioteca de base de datos en el marco de Zend .
Al acceder a una base de datos MySQL desde PHP parece haber varias formas:
Sprinkle the code with raw SQL-statements
Use the VO-pattern from Java (e.g. DB_DataObjects from PEAR)
DIY and write a script that auto-generates one PHP class per database
Además de esto, también he leído sobre LINQ in .NET
pero no lo he visto implementado en PHP.
¿Qué otros patrones hay?
Si comenzó a construir un sitio web desde cero hoy, ¿cuál elegiría?
Aclaración: no se trata de capas de abstracción de DB (PDO, MDB2). El patrón que se discute aquí es algo que se basa en PDO o MDB2.
Además de esto, también he leído sobre LINQ en .NET pero no lo he visto implementado en PHP.
Algo como Linq todavía no se puede implementar en PHP porque el lenguaje carece de las construcciones necesarias. Se ha creado una especie de "linq falso", pero esto solo usa cadenas y no es "real" linq. E incluso si lo fuera, es solo el equivalente de Linq a los objetos y no hay nada como Linq en SQL.
"Depende"
Para mis propios proyectos, tiendo a usar un marco de algún tipo, que incluye una capa de abstracción. Para proyectos más pequeños que no son apropiados para un framewok, simplemente coloco el SQL en el script (porque es pequeño). La última vez que hice una aplicación de gran tamaño sin un marco, utilicé PDO porque es un soporte fácil de preparar, etc. Es una capa de abstracción bastante fácil de aprender. Probablemente lo use de nuevo, si elijo no usar un marco por alguna razón.
Elegiría la capa de abstracción de la base de datos MDB2 de PEAR: proporciona un método agradable y abstracto para tratar con la base de datos. Lo recomiendo, ya que le permite escribir código portátil que puede ser portado a un servidor de base de datos diferente sin muchos cambios necesarios (para un script básico, basta con cambiar la llamada de conexión es suficiente). Es una combinación de las antiguas capas de abstracción de DB y Metabase (DB todavía es compatible con correcciones de errores, pero ha sido reemplazado por MDB2).
Ofrece características como prepare + emulación de ejecución para DB que no la admiten correctamente y le permite usar marcadores de posición, lo cual es una buena práctica para evitar problemas de inyección de SQL.
Funcionará con: mysql / mysqli, pgsql (PostgreSQL), oci8 (Oracle), sqllite, msql, mssql (Microsoft SQL Server), sybase, informix, fbsql, ibase, odbc.
Eche un vistazo a la documentación de MDB2 para ver cómo funciona.
Hago un enfoque de dos niveles codificado a mano:
primer nivel es un conjunto simple de funciones:
- do_query (sql): devuelve el objeto de resultado (abrir).
- get_record (sql): devuelve el primer registro, la consulta se cierra.
- get_datum (sql): devuelve el primer campo del primer registro (consulta cerrada)
después de eso, escribo mi capa de modelo, con funciones específicas para todas las operaciones de datos. generalmente un solo archivo con secciones para cada objeto conceptual. los parámetros están vinculados a los datos abstractos, no a la estructura SQL. todo SQL está en esta capa.
Lea lo que el propio Sr. Lerdorf tiene que decir sobre "Agregar estructura" a un sitio PHP.
www.oracle.com/technology/pub/articles/php_experts/rasmus_php.html
Para ejecutar un comando, usaría funciones para comandos SQL comúnmente ejecutados. Estas funciones se pueden usar para hacer algo más específico como get_users ()
a) Realice una función para cada una de las consultas que desee realizar, como
db_select($opts)
donde $ opts es una matriz hash con claves:
[''table_name'', ''selection'', ''condition'', ''group_by'', ''order_by'', ''limit'']
b) Si utilizó SQL en gran medida, podría sentir la tentación de crear un generador de comandos SQL, que toma una matriz hash y devuelve un comando. Algo como:
db_builder(array(''select''=>array(''customers'',''from''=>''bar'',''where''=>''foo=10'')))
Las funciones mencionadas anteriormente usarían esto en sus implementaciones y lo mismo harían si necesitaran una declaración completamente aleatoria, y con suerte todo sería sólido al reutilizar el código del generador de comandos en todas partes.
Por lo menos, use PDO. Proporciona una interfaz común para la mayoría de las plataformas de bases de datos, por lo que es más fácil cambiar las soluciones de bases de datos, en caso de que lo desee.
Me gusta usar un Object Relational Mapper (ORM), como propel: http://propel.phpdb.org/trac/
Esto correlaciona los objetos directamente con el esquema de la base de datos, no se requiere SQL. El mapeo ocurre en un archivo XML, la consulta ocurre a través de los objetos Criteria. Es posible aplicar ingeniería inversa a las clases de PHP desde una base de datos, o generar una base de datos desde el esquema xml.
Para obtener más información sobre ORM en general, consulte http://en.wikipedia.org/wiki/Object-relational_mapping
Si quieres un enfoque orientado a objetos, este es el enfoque que he tenido recientemente.
Separé las cosas en dos clases,
Primero, una clase DatabaseTable: toma un nombre de tabla, una cadena que es la clave de esa tabla. En segundo lugar, creo una clase DatabaseObject que representa una fila en una DatabaseTable. DatabaseObject tiene dos rutinas setFromRow y getAsRow. SetFromRow configurará el objeto a partir de una matriz asociativa de pares col => value, y get as row esencialmente serializará el objeto como col => pares de valores.
DatabaseTable utiliza setFromRow para fabricar DatabaseObjects cuando se llama al método select en la tabla. Por el contrario, cuando se le dice que actualice o inserte datos en su tabla, DatabsaeTable serializará el DatabaseObject usando getAsRow.
Por lo general, lo que sucede es que uno hereda de DatabaseObject para su propio objeto en particular, define setFromRow y getAsRow, y se le dice a DatabaseTable el nombre del DatabaseObject para instanciar.
Entonces, lo que terminas escribiendo, sabio en código es algo como esto
$dbTable = new DatabaseTable(''tableName'', ''uniqueid'', ''InstanceType'')
// dbTable manufactures an InstanceType for our use based on the select below
$dbRow = $dbTable->selectUsingId(15);
print_r($dbRow); // Dumps the InstanceTypeObject
Esto separa la representación de datos (DatabaseObject) en mi aplicación de la gestión de las tablas de la base de datos (DatabaseTable). Entonces mi DatabaseObject puede ser, en terminología C ++, plain-old-data.
Por supuesto, puede ir más allá, como yo, creando relaciones entre tablas y creando más formas de seleccionar, etc.
Debo agregar que integrar lo que es esencialmente un lenguaje de procedimiento (SQL) con lo orientado a objetos no es fácil, entonces mi método, lo sé, tiene sus desventajas y es probable que obtenga muchas respuestas diferentes, cada una con sus propios inconvenientes.
También puede considerar el uso de CodeIgniter , un pequeño framework MVC para PHP. Tiene una implementación de ActiveRecord y un conjunto razonable de objetos de base de datos (incluidas variables enlazadas). Encuentro que sus clases DB son mucho más agradables que las API PHP MySQL predeterminadas, y un poco más simples que las PDO (ciertamente más fáciles de instalar).
Use una estructura MVC y una capa de abstracción de base de datos. De esta forma, puede ir a un lugar para volver a trabajar completamente las partes internas de una clase de acceso a datos mientras mantiene constante la interfaz pública.
El SQL en bruto en todo el código va a ser casi imposible de escalar.
Podría usar un ORM como Doctrine.
Cualquier forma es buena, siempre y cuando minimices los puntos en los que necesitas modificar tu código cuando cambia el esquema de tu base de datos (entrada, filtrado, validación, generación de formularios, etc.).
Me gusta mantenerlo simple con PDO , SQL parametrizado y clases que resumen el conjunto de datos devuelto ( ::getActiveUsers()
, ::getUserPersonalData()
etc.).