簡體   English   中英

php和mysql,最佳實踐

[英]php and mysql, best practices

我今天開始使用php和mysql。 基本上,我所擁有的是一個空頁面,其中包含我在數據庫中查找id時填寫的內容。 所以在我的主頁上我有一個看起來像這樣的網址:

<a href="content/display.php?id=id1">

然后在我的display.php中我有這個:

<?php
    include '../includes/header.php';
    $id = $_GET['id'];
    $mysqli = new mysqli('localhost','username','password','dbname');
    if($result = $mysqli->query("SELECT * FROM portfolio WHERE id='".$id."'"))
    {
        while($row = $result->fetch_object())
        {
            $head = $row->head;
            $img1 = $row->img1;
            $img2 = $row->img2;
            $img_url = $row->imgurl;
            $img_thumb = $row->imgthumb;
            $vid = $row->vid;
            $swf = $row->swf;
            $url = $row->url;
            $url_text = $row->urltext;
            $text = $row->text;
        }
    }
    else echo $mysqli->error;
?>

這是一個稀疏表,因為並非所有這些字段都有信息(許多字段可能為空)。 基本上它們包含文件名,然后在html中我有如下代碼:

if(isset($img1))
                    {
                        echo '<img src="images/'.$img1.'" />';
                    }

幾個問題,

  1. 這是最好的方法嗎?
  2. 每次我訪問display.php時,我都在重新打開數據庫連接嗎? 這不可能是好的......
  3. 我選擇將文件的名稱放在數據庫中,而不是整個路徑名,甚至是實際的文件本身,想一想,如果我更改文件的名稱,我可以進入數據庫並為文件更新它想要改變。 如果我更改路徑,我可以在html中更改一次。 這是最好的主意嗎?

謝謝!

您很容易受到SQL注入的攻擊,正確地輸入您的變量:

$id = (int) $_GET['id'];

使用mysql_real_escape_string等函數甚至更好用:

1)不,雖然這是最簡單的開始方式。 在您對基礎知識感到滿意之后,您應該花一些時間考慮應用程序結構的不同方法。 最重要的規則是分開關注點。 不要將數據庫代碼與業務邏輯代碼與表示代碼混合在一起。 但就像我說的那樣,這不是你第一天應該擔心的事情。 現在只學習基礎知識。

2)實際上沒有其他辦法。 對於Web應用程序,來自瀏覽器的每個請求都類似於單獨的應用程序運行。 有可能使用所謂的持久性數據庫連接,但就像之前的那樣,這是您第一天不應該處理的事情,因為它們需要特定的Web服務器配置。 暫時只使用普通連接。

3)這是非常明智的想法。 您還可以將圖像路徑定義為PHP常量,以便在需要更改時,您只需更改此常量。

4)sAc在他的回答中說的非常重要。 閱讀有關SQL注入以及如何防止它們的信息。

已經提到了SQL注入和預處理語句。 除此之外還有:

else echo $mysqli->error;

改為:

else trigger_error($mysqli->error,E_USER_ERROR);

你為什么問? 因為訪問者應該不知道您的數據庫,並且無法修復錯誤,所以他們應該不會看到它。 這樣,您可以安全地使用display_errors進行開發,並在實時站點上關閉display_errors ,並在錯誤日志中記錄log_errors

看起來你很好地處理了你想做的事情。 我不知道你有多少開發背景,但是開始學習像CakePHP,Fuse甚至Zend Framework這樣的MV中的MVC是個好主意(bleh !!!)。 通過預先定義所有基本的數據庫接口,模板處理,會話處理,讓您省去更高級別的問題,比如午餐時間,我會節省您在更強大的應用程序上的時間! :)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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