2010-07-29 150 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是一个好主意。我将通过预先定义所有基本的数据库接口,模板处理和会话处理来节省更多强大的应用程序,并让您担心更高级别的问题,例如午餐时间! :)