最长的时间,我一直在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风格没有存储过程。
答案 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)
答案 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%的时间你处于幸福状态。
答案 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));