php和mysql,最佳实践

php和mysql,最佳实践,php,mysql,mysqli,Php,Mysql,Mysqli,我今天开始使用php和mysql。基本上,我拥有的是一个空页面,其中包含我在数据库中查找id时填写的部分。因此,在我的主页上,我有一个如下所示的url: <a href="content/display.php?id=id1"> 然后在我的display.php中,我有以下内容: <?php include '../includes/header.php'; $id = $_GET['id']; $mysqli = new mysqli('loca

我今天开始使用php和mysql。基本上,我拥有的是一个空页面,其中包含我在数据库中查找id时填写的部分。因此,在我的主页上,我有一个如下所示的url:

<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;
?>
您易受攻击,请正确键入您的变量:

$id = (int) $_GET['id'];
使用以下功能,甚至更好地使用:

  • 不,尽管这是最简单的开始方式。在您熟悉了基础知识之后,您应该花一些时间考虑应用程序结构的不同方法。最重要的规则是分离关注点。不要将数据库代码、业务逻辑代码和表示代码混为一谈。但就像我说的,这不是你第一天应该担心的事情。现在只需学习基础知识

    2) 实际上没有别的办法了。对于web应用程序,来自浏览器的每个请求都类似于应用程序的单独运行。有可能使用所谓的持久数据库连接,但正如前面所述,这是您不应该在第一天处理的事情,因为它们需要对web服务器进行特定的配置。目前只需使用普通连接即可

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


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

    已经提到了SQL注入和预处理语句。除此之外还有:

    else echo $mysqli->error;
    
    改为:

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

    你为什么问?因为访问者应该不知道您的数据库,并且无法修复错误,所以他们不应该看到它。这样,您就可以安全地开发
    display\u errors
    on,而在live site上
    display\u errors
    处于关闭状态,您可以
    log\u errors
    在错误日志中记录错误。

    看起来您可以很好地处理您想要做的事情。我不知道您有多少开发背景,但最好开始学习php中的MVC,比如CakePHP、Fuse,甚至Zend Framework(bleh!!!)。我将通过预先定义所有基本的数据库接口、模板处理、会话处理,并让您担心更高级别的问题,例如午餐吃什么,从而为您节省更多健壮应用程序的时间:)

    (重新)打开数据库连接是常见的做法,应该没什么大不了的。我确实想知道为什么你想让对象的每个属性都在另一个变量中?我想这样我就不必把整个站点包装在while循环中了……我想我可以这样做,因为我已经为jdbc使用了准备好的语句,但没有为php使用,所以我有点熟悉。我去看看。因为我的id不是int,所以这就是mysql\u real\u escape\u字符串的用途吗?Thanks@JPC:是的,您可以使用
    什么mysql\u real\u escape\u string
    。错误记录在哪里?我必须在某个地方配置显示错误和记录错误吗?我认为事实上最好的方法是将所有错误转换为此处所述的错误异常,但这是一个更高级的主题。@Mchl异常更多的是错误处理,而Wrikken谈论的是错误跟踪。这是不同的世界,不会相互干扰。实际上,您可以在同一个脚本中使用这两种方法。@JPC:yes,configure
    display\u errors
    log\u errors
    &
    error\u log
    (在php.ini中,Web服务器的vhost配置,或.htacces文件)@Mchl:如果您的应用程序设计用于处理其他位置的错误,那么ErrorExceptions是可以的,因此它应该“在树上”。如果在这种情况下,期望的结果是“如果查询失败,请不要打印任何内容”,那么就没有必要抛出错误条件,因为您正在原地处理它。但是,由于OP正在学习a.t.m,了解异常以及如何使用异常确实是明智的。我对MVC方法很熟悉。然而,我对PHP还是相当陌生的。我使用了Struts 2,将框架放在一起,以便于分离业务、数据和表示。为了将来的参考,我想学习更多关于如何在php中实现这一点的知识。有什么好的入门指南的建议吗?谢谢哦,在这种情况下,它是完全不同的谈话:)有几个可用于PHP的MVC框架在实现细节上有很大的不同。一个非常流行的是Zend框架,许多人说它实际上是松散耦合类的集合。另一方面,也有像Symfony这样的框架实现了“按约定配置”模型。你肯定会找到适合你需要的东西。@Schrapnel上校,我对这个网站和回答协议还是有点陌生。我没有意识到我只能选择一个答案。@Mchl设置这些问题需要很多时间吗?每当我想建立一个struts 2项目时,我都需要配置很多东西,所以对于一个相对较小的项目,比如个人网站,我认为这不值得我花时间。另外,我想练习我的php!当我在struts 2中开发时,我只需将.war部署到tomcat服务器上,它就可以正常工作了。对于使用php的服务器,您使用的服务器是否必须已经安装了框架?谢谢PHP世界与Java世界有些不同。在PHP5.3中使用了phar文件格式,理论上可以提供与.war相同的好处。我从未见过它在使用。要在服务器上安装PHP应用程序,通常需要上传应用程序包含的所有文件。这可能是一项乏味而棘手的任务,因此版本控制和持续集成工具非常有用。Zend Framework(可能还有其他的)有一个命令行工具,可以为您完成很多“设置新项目”的工作。您在几秒钟内就有了一个功能性应用程序。虽然它只显示一个静态页面;)
    else trigger_error($mysqli->error,E_USER_ERROR);