2010-07-29 146 views
5

我今天開始使用php和mysql。基本上,我所擁有的是一個空白頁面,其中包含通過在數據庫中查找ID填充的片段。所以,在我的主頁我有一個看起來像這樣的網址:php和mysql,最佳實踐

<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. 我選擇將文件的名稱放在數據庫中,而不是整個路徑名,甚至是實際的文件本身,因此,如果我更改文件的名稱I可以進入數據庫併爲我想更改的文件進行更新。如果我改變路徑,我可以在html中更改一次。這是最好的主意嗎?

謝謝!

+0

(重新)打開數據庫連接是常見的做法,它應該沒有多大關係。我想知道爲什麼你想要另一個變量中的對象的每個屬性? – Wrikken 2010-07-29 16:50:48

+0

我想所以我沒有包裹整個網站在while循環...我想我可以做到這一點,雖然 – JPC 2010-07-29 16:54:21

回答

6

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

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

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

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

+0

1)我熟悉MVC方法。不過,我對PHP相當陌生。我使用了Struts 2,框架放在一起便於分離業務,數據和表示。爲了將來的參考,我想了解更多關於如何在php中做到這一點。任何一個好的指南的提示開始? 謝謝! – JPC 2010-07-29 17:01:32

+0

哦,在這種情況下,它是完全不同的談話:) 有幾個用於PHP的MVC框架在實現細節方面有很大不同。一個非常流行的是Zend Framework,許多人說它實際上是一個鬆耦合類的集合。另一方面,像Symfony這樣的框架實現了'按照約定配置'模式。你一定會找到適合你需求的東西。 – Mchl 2010-07-29 17:11:04

+0

@Col。彈片我對這個網站和回答協議還是比較陌生的。我沒有意識到我只能選擇一個答案。 – JPC 2010-07-29 17:11:12

6

你很容易受到SQL injection,正確類型強制轉換的變量:

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

使用功能,如mysql_real_escape_string甚至更​​好的使用:

+2

+1爲準備語句 – Wrikken 2010-07-29 16:49:36

+0

我已經使用準備語句的jdbc但不是PHP,所以我'有點熟悉。我會檢查一下。由於我的id不是int,是mysql_real_escape_string的用途嗎?謝謝 – JPC 2010-07-29 16:56:19

+0

@JPC:是的,你可以使用'什麼mysql_real_escape_string'。 – Sarfraz 2010-07-29 16:57:30

1

SQL注入&已準備好的語句已經提及。一個除了會:

else echo $mysqli->error; 

修改成:

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

你問爲什麼?因爲訪問者應該不知道你的數據庫,並且不能修復錯誤,所以他們顯然不應該看到它。這樣,您就可以安全地用display_errors進行開發,並且在活動網站display_errors處於關閉狀態,而您在log_errors處於錯誤日誌中。

+0

錯誤在哪裏得到記錄?我必須在某處配置display_errors和log_errors嗎? – JPC 2010-07-29 16:59:11

+0

我認爲實際上最好的方法是將所有錯誤轉換爲ErrorExceptions,如http://php.net/manual/en/class.errorexception.php所述,但它又是一個更高級的話題。 – Mchl 2010-07-29 17:03:10

+1

@Mchl異常更多的是錯誤*處理* Wrikken談論錯誤*跟蹤*。那是不同的世界,不會干涉。其實你可以在同一個腳本中使用兩者。 – 2010-07-29 17:09:01

1

看起來你對你想要做的事有很好的把握。我不知道你有多少開發背景,但是在CakePHP,Fuse或甚至Zend Framework(bleh !!!)中開始學習有關MVC的php是一個好主意。我將通過預先定義所有基本的數據庫接口,模板處理和會話處理來節省更多強大的應用程序,並讓您擔心更高級別的問題,例如午餐時間! :)