php和mysql,最佳实践

时间:2010-07-29 16:45:40

标签: php mysql mysqli

我今天开始使用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中更改一次。这是最好的主意吗?
  4. 谢谢!

4 个答案:

答案 0 :(得分:6)

您容易受SQL injection攻击,正确输入变量:

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

使用mysql_real_escape_string等功能,甚至更好地使用:

答案 1 :(得分:6)

1)不,虽然这是最简单的开始方式。在您对基础知识感到满意之后,您应该花一些时间考虑应用程序结构的不同方法。最重要的规则是分开关注点。不要将数据库代码与业务逻辑代码与表示代码混合在一起。但就像我说的那样,这不是你第一天应该担心的事情。现在只学习基础知识。

2)实际上没有其他办法。对于Web应用程序,来自浏览器的每个请求都类似于单独的应用程序运行。有可能使用所谓的持久性数据库连接,但就像之前的那样,这是您第一天不应该处理的事情,因为它们需要特定的Web服务器配置。暂时只使用普通连接。

3)这是非常明智的想法。您还可以将图像路径定义为PHP常量,以便在需要更改时,只更改此常量。

4)sAc在他的回答中说的非常重要。阅读有关SQL注入以及如何防止它们的信息。

答案 2 :(得分:1)

SQL注入&amp;已经提到了准备好的陈述。除此之外还有:

else echo $mysqli->error;

将其更改为:

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

你为什么这么问?因为访问者应该不知道您的数据库,并且无法修复错误,所以他们应该不会看到它。通过这种方式,您可以安全地使用display_errors开启,并且在实际网站display_errors关闭,并在错误日志中log_errors

答案 3 :(得分:1)

看起来你可以很好地处理你想做的事情。我不知道你有多少开发背景,但是开始学习像CakePHP,Fuse甚至Zend Framework这样的MV中的MVC是个好主意(bleh !!!)。通过预先定义所有基本的数据库接口,模板处理,会话处理,让您省去更高级别的问题,比如午餐时间,我会节省您在更强大的应用程序上的时间! :)