2010-07-29 42 views
5

Tôi bắt đầu làm việc với php và mysql hôm nay. Về cơ bản, những gì tôi có, là một trang trống với các phần mà tôi điền vào từ tìm kiếm một id trong cơ sở dữ liệu. Vì vậy, trên trang chủ của tôi Tôi có một url trông như thế này:php và mysql, các phương pháp hay nhất

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

Và sau đó trong display.php của tôi, tôi có điều này:

<?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; 
?> 

Đó là một bảng thưa thớt ở chỗ không phải tất cả những lĩnh vực sẽ có thông tin (nhiều thông tin có thể là null). Về cơ bản họ chứa tên tập tin và sau đó trong html tôi có mã trông như thế này:

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

Một vài câu hỏi,

  1. Đây có phải là cách tốt nhất để làm điều này?
  2. Mỗi khi tôi truy cập display.php, tôi mở lại kết nối cơ sở dữ liệu đúng không? Điều đó không thể tốt ...
  3. Tôi đã chọn đặt tên của các tệp trong cơ sở dữ liệu, chứ không phải toàn bộ tên đường dẫn hoặc thậm chí là các tệp thực tế, cho rằng, nếu tôi thay đổi tên của tệp có thể vào cơ sở dữ liệu và cập nhật nó cho tệp tôi muốn thay đổi. Nếu tôi thay đổi đường dẫn, tôi chỉ có thể thay đổi nó một lần trong html. Đó có phải là ý tưởng tốt nhất?

Cảm ơn!

+0

(lại) mở kết nối cơ sở dữ liệu là thực tế phổ biến, nó không quan trọng lắm. Tôi tự hỏi tại sao bạn muốn mọi tài sản của đối tượng trong một biến khác mặc dù? – Wrikken

+0

Tôi đoán vậy tôi không phải quấn toàn bộ trang web trong vòng lặp đó ... Tôi cho rằng tôi có thể làm điều đó mặc dù – JPC

Trả lời

6

1) Không, mặc dù đó là cách dễ nhất để bắt đầu. Sau khi bạn cảm thấy thoải mái với những điều cơ bản, bạn nên dành thời gian xem xét các cách tiếp cận khác nhau đối với cấu trúc ứng dụng. Quy tắc quan trọng nhất là phân tách các mối quan tâm. Không trộn mã cơ sở dữ liệu với mã logic nghiệp vụ với mã trình bày. Nhưng như tôi đã nói, đó không phải là điều bạn nên lo lắng trong ngày đầu tiên. Bây giờ chỉ cần tìm hiểu cơ bản.

2) Không có cách nào khác thực sự. Đối với một ứng dụng web, mỗi yêu cầu từ trình duyệt giống như một ứng dụng chạy riêng lẻ. Có khả năng sử dụng cái gọi là kết nối cơ sở dữ liệu liên tục, nhưng cũng giống như ở điểm trước đó, đó là điều bạn không nên đối phó vào ngày đầu tiên, vì chúng yêu cầu cấu hình cụ thể của máy chủ web của bạn. Hiện tại, chỉ cần sử dụng các kết nối bình thường.

3) Đó là ý tưởng khá hợp lý. Bạn cũng có thể xác định đường dẫn hình ảnh của bạn dưới dạng hằng số PHP, để trong trường hợp cần thay đổi, bạn chỉ thay đổi hằng số này.

4) Điều mà sAc nói trong câu trả lời của ông là rất quan trọng. Đọc về tiêm SQL và cách ngăn chặn chúng.

+0

1) Tôi quen thuộc với cách tiếp cận MVC. Tuy nhiên, tôi khá mới với PHP. Tôi đã sử dụng Struts 2 và khung công tác được đặt lại với nhau để tạo điều kiện tách doanh nghiệp, dữ liệu và bản trình bày. Để tham khảo trong tương lai, tôi muốn tìm hiểu thêm về cách thực hiện điều này trong php. Bất kỳ lời khuyên của một hướng dẫn tốt để bắt đầu với? Cảm ơn! – JPC

+0

Oh trong trường hợp đó hoàn toàn khác nhau nói chuyện :) Có một số khung MVC cho PHP có sẵn khác nhau rất nhiều trong chi tiết thực hiện. Một trong rất phổ biến là Zend Framework, nhiều người nói nó thực sự là một bộ sưu tập các lớp học lỏng lẻo kết hợp. Mặt khác, có các khung công tác như Symfony thực hiện mô hình 'cấu hình theo quy ước'. Bạn chắc chắn sẽ tìm thấy một cái gì đó phù hợp với nhu cầu của bạn. – Mchl

+0

@Col. Shrapnel Tôi vẫn còn mới với trang web này và trả lời giao thức. Tôi không nhận ra mình chỉ có thể chọn một câu trả lời. – JPC

6

Bạn đang dễ bị SQL injection, đúng cách gõ đúc các biến của bạn:

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

Sử dụng các chức năng như mysql_real_escape_string hoặc thậm chí sử dụng tốt hơn:

+2

+1 cho báo cáo đã chuẩn bị – Wrikken

+0

Tôi đã sử dụng câu lệnh chuẩn bị cho jdbc nhưng không dùng cho php vì vậy tôi ' m hơi quen thuộc. Tôi sẽ kiểm tra điều đó. Kể từ khi id của tôi không phải là một int, là những gì mysql_real_escape_string là dành cho? Cảm ơn – JPC

+0

@JPC: Có, bạn có thể sử dụng 'mysql_real_escape_string'. – Sarfraz

1

Chèn SQL & báo cáo chuẩn bị đã được đề cập.Một Bên cạnh đó sẽ là:

else echo $mysqli->error; 

Thay đổi đó để:

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

Tại sao bạn yêu cầu? Bởi vì khách truy cập sẽ không có ý tưởng về cơ sở dữ liệu của bạn và không thể sửa lỗi, vì vậy họ không nên nhìn thấy nó. Bằng cách này, bạn có thể phát triển an toàn với display_errors bật và trên trang web trực tiếp display_errors bị tắt và bạn log_errors trong nhật ký lỗi.

+0

nơi nào các lỗi được ghi lại? sao tôi phải cấu hình display_errors và log_errors ở đâu đó? – JPC

+0

Tôi sẽ lập luận rằng trên thực tế cách tốt nhất là chuyển tất cả các lỗi thành ErrorExceptions như được mô tả ở đây http://php.net/manual/en/class.errorexception.php, nhưng một lần nữa nó là một chủ đề nâng cao hơn một chút. – Mchl

+1

@Mchl ngoại lệ có nhiều lỗi * xử lý * trong khi Wrikken đang nói đến lỗi * theo dõi *. đó là những thế giới khác nhau, không can thiệp. Trên thực tế bạn có thể sử dụng cả hai trong cùng một kịch bản. –

1

Có vẻ như bạn đã xử lý tốt những gì bạn muốn làm. Tôi không biết bạn có bao nhiêu nền tảng phát triển, nhưng bạn nên bắt đầu tìm hiểu về MVC trong php như CakePHP, Fuse, hoặc thậm chí Zend Framework (bleh !!!). Tôi sẽ giúp bạn tiết kiệm thời gian cho các ứng dụng mạnh mẽ hơn bằng cách xác định trước tất cả giao diện db cơ bản, xử lý mẫu, xử lý phiên và cho phép bạn lo lắng về các vấn đề cấp cao hơn, chẳng hạn như bữa trưa! :)

Các vấn đề liên quan