簡體   English   中英

是否有更好的,更“標准”的方法在不使用框架的情況下在PHP中執行SQL查詢?

[英]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,但這確實很少。

原則是圍繞PDOORM

我一直想知道為什么我總是看到這樣更復雜的字符串構建形式:“ 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%的時間您處於幸福狀態。

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

您可以使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM