在不使用框架的情况下,是否有更好的,更“标准”的方式在PHP中执行SQL查询?

时间:2009-11-06 04:14:34

标签: php sql orm

最长的时间,我一直在PHP中使用以下基本格式的SQL查询:

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

虽然这样可以完美地工作,但是对于更长时间的代码来说它可能会变得非常混乱,而且每当我这样做时,我良心深处的内容就会在字符串连接处cr。。。尽管如此,它仍然有效,我几乎无处不在地使用它而没有重大问(这是一个温和的例子,我不够密集,不能将用户数据直接传递到SQL字符串而不先逃避它等等。)

我想做的是面向对象的东西,但我不确定最好的方法是什么。能够sql->插入($ values [,$ where,$ extra])会很高兴;或类似的东西,使用PHP的自然关联数组类型以更简化的方式传递查询字符串。不太灵活?是。更具可读性?哎呀,更难以在此处做出“沉默”的语法错误。

社区对此有何看法?您对此问题的看法是哪些对您正在进行的项目最有效?

并不重要,但我个人并没有比SELECT,INSERT和UPDATE更复杂,偶尔嵌套子查询,但这主要是因为我的SQL风格没有存储过程。

8 个答案:

答案 0 :(得分:4)

PDO是一个很好的,可靠的,安全的解决方案,许多框架都是由它构建的。如果你要从底层开始,PDO是一个坚实的基础。

答案 1 :(得分:0)

也许至少使用PHP的字符串变量替换会让你更开心:

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

答案 2 :(得分:0)

MDB_QueryTool我从未尝试过。

恕我直言Zend_DB真的很酷,zend框架允许你只使用你感兴趣的部分,所以如果你不想要完整的框架,你可能想看看它。

我在Zend_DB中喜欢的是表选择语法

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

您可以轻松查看所涉及的所有标准和表格,因此我发现使用纯SQL更好。只有一个警告Zend_DB不处理所有的SQL,所以你不得不编写纯SQL但这种情况很少见。

答案 3 :(得分:0)

DoctrineORM缠绕PDO

答案 4 :(得分:0)

我一直想知道为什么我总是会看到更复杂的字符串构建形式: “文字字符串”。 $ a。 “更文字”,而不是“文字字符串$ a more literal”,或者在你的情况下:

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

而不是:

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

对于更复杂的表达式,我喜欢使用sprintf(但我很长时间以来都是c程序员):

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

这也可以用以下格式编写:

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

在这种情况下,它买不多,但当字符串中嵌入了多个变量时,它便于管理。

答案 5 :(得分:0)

学说的另一次投票。不要在PDO上浪费你的时间。我不能强调这一点。和一个orm一起去。忘记浪费时间编写CRUD方法,自定义缓存逻辑,并担心过早优化,例如库产生的“开销”。由“select * from app_users”及其相关丑陋的heredocs等语句引发的开销不值得。

如果你需要回退到sql,你可以。另外90%的时间你处于幸福状态。

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

答案 6 :(得分:0)

您可以使用mysqli在SQL中编写小占位符,然后填入它们。它应该不像SQL注入攻击那样容易受到字符串连接的影响。

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

答案 7 :(得分:0)

尝试:

$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));