2010-06-15 17 views
5

¿Puede alguien señalarme un recurso o mostrarme un ejemplo de una buena forma de escribir sentencias sql en php?Práctica recomendada para escribir sentencias sql en php

La mayoría de las declaraciones parecen tan feas e ilegibles.

+0

Algunas preguntas relacionadas: http://stackoverflow.com/questions/37791/how-do-you-manage-sql-queries http://stackoverflow.com/questions/1685362/is-there-a- mejor-más-estándar-manera-de-realizar-sql-consultas-en-php-sin-usin http://stackoverflow.com/questions/1342556/how-can-i-separate-sql-from-my- php – JYelton

+0

No escriba SQL en PHP: use los procedimientos almacenados: http://www.joeyrivera.com/2009/using-mysql-stored-procedures-with-php-mysqlmysqlipdo/ –

+0

Acabo de ver esta pregunta. Para futuros visitantes o principiantes, esto puede ayudar: [PHP: The Right Way] (http://www.phptherightway.com/) –

Respuesta

0

personalmente me gusta separar mi SQL a cabo de esta manera:

SELECT * FROM `table` a 
INNER JOIN `table2` b 
ON a.`id`=b.`id` 
WHERE b.`colour` = "frink" 

Así me gusta poner los comandos separados en nuevas líneas que mantiene las cosas fáciles de leer.

5
  1. Uso prepared statements
  2. Siéntase libre para dar formato a su código

Ejemplo de código:

$stmt = $pdo->prepare(' 
    SELECT ... 
    FROM ... 
    JOIN ... 
    JOIN ... 
    WHERE ... AND abc = :abc AND def = :def 
'); 

$stmt->execute(array(
    'abc' => 'abc value', 
    'def' => 'def value' 
)); 
1

Considere prepared statements

$stmt = $db->prepare("SELECT col1, col2, col3 FROM tbl WHERE col1 = ? AND col2 = ?"); 
$stmt->bindParam(1, $col1); 
$stmt->bindParam(2, $col2); 

O usando sprintf().

$sql = sprintf("SELECT col1, col2, col3 FROM tbl WHERE col1='%s' AND col2='%s'", 
    mysql_real_escape_string($col1), 
    mysql_real_escape_string($col2) 
); 

De cualquier manera, usted va a terminar con una gran cadena SQL concatenada que es más fácil de leer.

0

SQL, IMO, a menudo parece feo e ilegible debido al estrecho acoplamiento con otras capas de código. Las consultas complejas de SQL a menudo necesitan una construcción condicional y cuando comienzas a lanzar HTML entre la consulta SQL, además de la lógica de negocios, etc. el resultado es un código ilegible.

Considere usar una DAL (capa de acceso a datos) o más formalmente, la puerta de enlace de datos de tabla o simplemente una puerta de enlace SQL. Además, proporcionará ventajas increíbles:

  1. resúmenes hacer la conmutación de código SQL/portar a otro RDBMS mucho más fácil
  2. aísla el código SQL de su lógica y plantillas de negocio, etc hacer el código más legible.

Saludos, Alex

1

que utiliza un cliente de MySQL para trabajar en mis consultas (SQLWave). herramienta muy útil que te permite hacer consultas y guardarlos como SQL, se dará salida a un archivo de la siguiente manera:

/* 
get-all-tags.sql 

get all tags from t.tags, combine info with t.taglink to 
2012-12-18: updated blabla 

*/ 
select tags.*,group_concat(subid) as subs from t.tags 

    join t.taglink on taglink.id=tags.id 

group by id 
order by category,tag,subid 

Es la disposición prefiero, pero se puede utilizar su propia preferencia por supuesto. La consulta se puede insertar en el código de la siguiente manera:

mysql_query(file_get_contents("sql/get-all-tags.sql")); 

etc También se puede alterar de forma dinámica el contenido del archivo 'get-todas-tags' mediante la sustitución de cadenas con los valores que pueda necesitar.

NOTA !! NO estoy diciendo que esto sea rápido. El es una gran cantidad de gastos indirectos innecesarios en esto. Pero si quiere ir con el único propósito de mantener su código PHP limpio y claro, esta es una muy buena alternativa.

Para un mejor rendimiento, puede 'compilar' su código PHP en el código que publica reemplazando "file_get_contents (" sql/get-all-tags.sql ") con el contenido real de ese archivo antes de cargar sus cosas.

Así, de nuevo, esto no es de código rápido, pero muy legible

Por supuesto, usted puede poner el mismo formato directamente en su código PHP, sin copiarlo desde un programa de cliente:

<? 
    $result=mysql_query(" 
     select tags.*,group_concat(subid) as subs from t.tags 
      join t.taglink on taglink.id=tags.id 
     group by id 
     order by category,tag,subid 
    "); 
?> 

Sin gastos generales, sin acceso a los archivos, por lo que es (relativamente) fas t

Cuestiones relacionadas