[英]Is there a better way to run multiple SQL queries to the same table using PHP?
[英]Is there a better, more “Standard” way to perform SQL queries in PHP without using a framework?
最長的時間,我一直在PHP中對SQL查詢使用以下基本格式:
$sql = "SELECT * FROM `user-data` WHERE `id` = '".$id."' LIMIT 1;";
$fn = mysql_fetch_assoc(mysql_query($sql));
盡管這可以完美地工作,但是對於更長的代碼來說,它可能會變得很混亂,而且每次執行字符串連接時,我內心深處的東西都會畏縮於字符串連接。 盡管如此,它仍然有效,並且我幾乎在所有地方都可以使用它而沒有重大問題。 (這是一個溫和的示例,我的密度不足以將用戶數據直接傳遞到SQL字符串中而不先轉義它,等等)。
我想做的是一些面向對象的東西,但是我不確定最好的方法是什么。 能夠sql-> insert($ values [,$ where,$ extra]); 或類似的方法,使用PHP的自然關聯數組類型以更簡化的方式傳遞查詢字符串。 不太靈活? 是。 更具可讀性? 不錯,而且更難犯“無聲的”語法錯誤。
社區對此有何看法? 您認為該問題最適合您正在從事的項目的方法有哪些?
沒關系,但是我個人做的事情並不比SELECT,INSERT和UPDATE復雜,只是偶爾嵌套了子查詢,但這主要是因為我的SQL風格不執行存儲過程。
PDO是許多框架所建立的良好,可靠,安全的解決方案。 如果您要從頭開始,PDO是堅實的基礎。
至少使用PHP的字符串變量替換可能會讓您更開心:
$sql = "SELECT * FROM `user-data` WHERE `id` = '$id' LIMIT 1;";
有我從未嘗試過的MDB_QueryTool 。
IMHO Zend_DB真的很棒,zend框架只允許您使用您感興趣的部分,因此,如果您不想使用完整的框架,則可能需要看一下事件。
我在Zend_DB中喜歡的是表選擇語法
$userRowset = $user->fetchAll( $user->select()
->where('name LIKE ?', $name . '%')
->order('id ASC')
->limit(10)
);
您可以輕松地查看所涉及的所有條件和表,因此我發現比做普通的SQL更好。 僅僅一個警告Zend_DB不能處理所有的SQL,因此您有時需要編寫普通的SQL,但這確實很少。
我一直想知道為什么我總是看到這樣更復雜的字符串構建形式:“ literal string”。 $ a。 “更多文字”,而不是“文字字符串$ a更多文字”,或者在您的情況下:
"SELECT * FROM `user-data` WHERE `id` = '".$id."' LIMIT 1;";
代替這個:
"SELECT * FROM `user-data` WHERE `id` = '$id' LIMIT 1;";
對於更復雜的表達式,我喜歡使用sprintf(但我很長時間是ac程序員):
$sql = sprintf("SELECT * FROM `user-data` WHERE `id` = '%s' LIMIT 1", $id);
也可以使用以下格式編寫:
$sql = sprintf("
SELECT *
FROM `user-data`
WHERE `id` = '%s'
LIMIT 1",
$id);
在這種情況下,它不會花很多錢,但是當字符串中嵌入了多個變量時,它將使其更易於管理。
對理論的另一票。 不要浪費時間在PDO上。 我對此不夠強調。 去吧。 不用浪費時間來編寫CRUD方法,自定義緩存邏輯,以及擔心過早的優化,例如庫產生的“開銷”。 分散諸如“ select * from app_users”之類的語句及其相關的丑陋heredocs所引起的開銷是不值得的。
如果需要使用sql,可以。 其他90%的時間您處於幸福狀態。
您可以使用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");
嘗試:
$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));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.