2009-11-06 1 views
0

Pendant longtemps, je me sers de la mise en forme de base suivantes pour les requêtes SQL dans mon PHP:Existe-t-il un moyen plus "standard" d'exécuter des requêtes SQL en PHP sans utiliser de framework?

$sql = "SELECT * FROM `user-data` WHERE `id` = '".$id."' LIMIT 1;"; 
$fn = mysql_fetch_assoc(mysql_query($sql)); 

Bien que cela fonctionne parfaitement, il peut être vraiment compliqué pour les bits plus de code, et quelque chose de profond à l'intérieur de ma conscience grince la concaténation des cordes chaque fois que je le fais. Pourtant, cela fonctionne et je l'utilise presque partout sans problèmes majeurs. (C'est un exemple tame, je ne suis pas assez dense pour transmettre des données utilisateur directement dans une chaîne SQL sans l'échapper d'abord, etc.)

Ce que je voudrais faire est quelque chose d'un peu plus orienté objet, mais Je ne suis pas certain de la meilleure approche. Ce serait sympa de pouvoir juste insérer sql-> insert ($ values ​​[, $ where, $ extra]); ou quelque chose de similaire, en utilisant les types associatifs naturels de PHP pour passer dans les chaînes de requête d'une manière plus simplifiée. Moins flexible? Oui. Plus lisible? Heck oui, et plus difficile de faire des erreurs de syntaxe "silencieuses" à cela.

Quelle est la position de la communauté à ce sujet? Quelles approches avez-vous envisagées pour ce problème qui ont été les plus efficaces pour les projets sur lesquels vous travailliez? Cela n'a pas d'importance, mais personnellement, je ne fais pas beaucoup plus compliqué que SELECTs, INSERTs et UPDATEs, avec l'imbrication occasionnelle de sous-requêtes, mais c'est surtout parce que ma fonction SQL ne fait pas de procédures stockées.

+0

Même si je suis tout à fait conscient qu'il ya forcément des cadres qui existent pour résoudre ce problème, je suis en train d'éviter ces réponses. Je voudrais savoir comment on pourrait accomplir cela en commençant par une installation PHP à la vanille, en mettant l'accent sur l'examen du code sous-jacent qui le rend possible. –

Répondre

4

PDO est une bonne solution solide et sécurisée sur laquelle de nombreux frameworks sont construits. Si vous voulez commencer par le bas, PDO est une base solide.

+0

C'est certainement une caractéristique intéressante que je ne connaissais pas.^_^Nifty. –

0

Peut-être que ce serait faire de vous un peu plus heureux au moins d'utiliser la chaîne de substitution variable PHP:

$sql = "SELECT * FROM `user-data` WHERE `id` = '$id' LIMIT 1;"; 
+0

devez faire attention avec cela parce que vous avez besoin d'échappement approprié ou vous finissez à rendre un site Web plus vulnérable à l'injection SQL – RageZ

+0

Certes, mais ce n'est pas pire que la publication originale. – Grumdrig

0

Il y a MDB_QueryTool Je ne ai jamais essayé.

IMHO Zend_DB est vraiment cool, le framework zend vous permet d'utiliser uniquement la partie qui vous intéresse donc vous pourriez vouloir prendre un événement look si vous ne voulez pas le cadre complet.

ce que j'aime Zend_Db est la table syntaxe select

$userRowset = $user->fetchAll($user->select() 
->where('name LIKE ?', $name . '%') 
->order('id ASC') 
->limit(10) 
); 

Vous pouvez facilement voir tous les critères et table impliqués donc je trouve mieux que faire SQL ordinaire. Juste un avertissement Zend_DB ne gère pas tout le SQL, donc de temps en temps vous devrez écrire du SQL, mais c'est vraiment rare.

0

Je me demandais pourquoi je vois toujours la forme la plus compliquée de construction de chaînes comme ceci: "chaîne littérale". $ a.« Plus littéral », plutôt que « chaîne de caractères $ un plus littéral », ou dans votre cas:

"SELECT * FROM `user-data` WHERE `id` = '".$id."' LIMIT 1;"; 

au lieu de ceci:

"SELECT * FROM `user-data` WHERE `id` = '$id' LIMIT 1;"; 

Pour des expressions plus compliquées, je préfère utiliser sprintf (mais je suis programmeur ca depuis longtemps):

$sql = sprintf("SELECT * FROM `user-data` WHERE `id` = '%s' LIMIT 1", $id); 

cela peut aussi être écrit dans ce format:

$sql = sprintf(" 
    SELECT * 
     FROM `user-data` 
    WHERE `id` = '%s' 
     LIMIT 1", 
    $id); 

Dans ce cas, il n'achète pas beaucoup, mais quand il y a plusieurs variables incorporées dans la chaîne, cela facilite la gestion.

0

Un autre vote pour doctrine. Ne perdez pas votre temps avec PDO. Je ne peux pas insister assez sur cela. Aller avec un orm. Oubliez le temps perdu à écrire des méthodes CRUD, la logique de mise en cache personnalisée, et à vous soucier de l'optimisation prématurée comme "overhead" résultant d'une bibliothèque. Les frais généraux encourus par des déclarations comme "select * from app_users" et leurs heredocs associés ne valent pas le coup.

Si vous avez besoin de revenir à SQL, vous pouvez. L'autre 90% du temps, vous êtes dans un état de bonheur.

http://www.doctrine-project.org/

+0

Nick, j'ai remarqué votre commentaire sur la compréhension du code sous-jacent. Environ deux semaines après l'écriture de votre propre SQL, vous allez commencer à voir apparaître des modèles. Vous pourriez encore hésiter à utiliser un ORM ("c'est tellement plus que ce dont j'ai besoin!"), Et commencer à écrire vos propres fonctions d'utilité qui capturent ces modèles et idiomes émergents. Deux semaines après cela, vous allez regarder la doctrine et vous rendre compte qu'elle fait sortir vos services publics de l'eau. Vous verrez qu'il est incroyablement documenté, testé et stable. Même d'un point de vue pédagogique, un orme est bon. Regardez les journaux db si vous êtes curieux;) – Koobz

+0

Juste besoin d'ajouter. Si vous êtes intéressé à faire des applications Doctrine est la voie à suivre. Si vous êtes intéressé par l'écriture de votre propre framework de base de données, c'est à ce moment que vous aurez besoin de PDO. Mais ce n'est pas la partie amusante du développement web :) Doctrine a déjà fait cela et il y a quelques générations, donc les leçons ont été apprises et les améliorations apportées (Adodb, Pear, MDB2, Propel, Doctrine). Je ne peux pas le souligner assez: essayez l'ORM, surtout parce que ça sonne comme vous ne l'avez pas fait auparavant, et pleurez des larmes de joie. – Koobz

+0

Doctrine courir troqué PDO. Doctrine peut convenir pour les grands projets, mais, s'il utilise la requête comme "$ sql =" SELECT * FROM 'user-data' O WH' id' = '". $ Id."' LIMIT 1; "; ", je ne pense pas apprendre Doctrine ne vaut pas le prix. – Strae

0

Vous pouvez utiliser mysqli pour écrire des petits détenteurs de place en vous SQL puis les remplir. Il devrait être moins sensible aux attaques par injection SQL que concaténation de chaînes.

$conn = new mysqli($server, $username, $password, $database); 
$stmt = $conn->prepare('SELECT * FROM people WHERE age = ? AND name != ?'); 
$stmt->bind_param('is', 20, "Austin"); 
0

Essayez:

$stat2 = <<<SQL 
SELECT * from YOUR.DET_TABLE 
WHERE ID = ? 
ORDER BY ID, EFF_DT 
SQL; 
    $d_cur = $conn->prepare($stat2); 
    $status = $d_cur->execute(array($selected));