【问题标题】:PHP OOP coding conventions [closed]PHP OOP 编码约定 [关闭]
【发布时间】:2012-11-09 08:22:26
【问题描述】:

我是 OOP PHP 的新手,我希望尽快掌握尽可能多的编码约定。我制作了这个小小的留言簿脚本,我想知道是否有什么不应该做的事情。

索引.php:

<?php
$username = "root";
$password = "";
$database = "oop";
$host = "localhost";

mysql_connect($host, $username, $password);
mysql_select_db($database);
?>
<html>
<head>
</head>
<body>
    <?php
    include("views/gaestebog.php");
    ?>
</body>
</html>

Guestbook.php,类:

<?php
class Gaestebog {

    public function __contruct() {

    }

    public function getPosts() {
        $query = mysql_query("SELECT * FROM gaestebog");
        while ($row = mysql_fetch_array($query)) {
            echo '
            <tr>
                <td>'.$row['navn'].'</td>
            </tr>
            <tr>
                <td>'.$row['besked'].'</td>
            </tr>
            ';
        }
    }

    public function addPost($navn, $besked) {
        mysql_query("INSERT INTO gaestebog VALUES('', '$navn', '$besked')");
    }
}
?>

和guestbook.php,视图:

<?php
include("classes/Gaestebog.php");
$gaestebog = new Gaestebog();
if (isset($_POST['opret'])) {
    $navn = $_POST['navn'];
    $besked = $_POST['besked'];
    $gaestebog->addPost($navn, $besked);
}
?>
<table>
    <?php
    $gaestebog->getPosts();
    ?>
</table>

<hr />

<form action="" method="post">
    <table>
        <tr>
            <td>Navn:</td>
            <td><input type="text" name="navn" value="Patrick" /></td>
        </tr>
        <tr>
            <td>Besked:</td>
            <td><input type="text" name="besked" value="Hej med dig !!" /></td>
        </tr>
        <tr>
            <td><input type="submit" name="opret" value="Opret" /></td>
        </tr>
    </table>
</form>

【问题讨论】:

  • 似乎更适合codereview.stackexchange.com
  • 您可能需要在线查看有关您使用 MySQL 数据库操作的 PHP 手册,例如 mysql_query() 不再建议 php.net/manual/en/function.mysql-query.php 一种替代方法是使用 @987654327 @interface with is OOP.
  • 不要使用mysql,而是使用mysqliPDO。使用参数化查询。使用数据库抽象类,而不是在您的类中使用核心数据库函数。我现在能想到的就这些了
  • 当我使用 mysqli 时,我应该在 mysqli 连接的每个类中创建一个新对象吗?
  • @PatrickReck:不,您创建一个实例,然后将它传递给您的对象/方法。

标签: php oop convention


【解决方案1】:

几点:

  • 不要使用已弃用的 mysql 库,改用 PDO 或 MySQLi
  • __contruct() 有错字,应该是__construct()
  • 不要从 getPosts() 等 get 方法返回原始 HTML,而是返回一个帖子数组并让视图创建 HTML(如果这是您想要的输出)
  • 防止 SQL 注入,您的 INSERT 查询易受攻击

【讨论】:

    【解决方案2】:

    这通常被称为带有过时库的过程式编程:

    mysql_connect($host, $username, $password);
    mysql_select_db($database);
    

    这只是你剧本的开始。也许你最好不要太关注花哨的编程术语,而只是完成工作。

    示例guestbook.php

    <?php
    require('bootstrap.php');
    
    $page = new Htmlpage('My Guestbook');
    $page->start($_SERVER['REQUEST_URI']);
    
    $gaestebog = new Gaestebog();
    
    echo '<table border="1">';
    
    foreach ($gaestebog->getPosts() as $post)
    {
        $row = new Htmlencoded($post);
    
        echo <<<OUT
                <tr>
                    <td>$row['navn']</td>
                </tr>
                <tr>
                    <td>$row['besked']</td>
                </tr>
    OUT;
    }
    echo '</table>';
    
    $page->closeRequest();
    ?>
    

    否则,如果您想学习面向对象的编程,请使用对象接口并练习、练习、练习。

    从简单的东西开始,例如表单域。不是整个脚本。

    【讨论】:

    • 什么是“Gaestebog”?
    • @Simon_eQ:您的意思是:Wat de hel 是“Gaestebog”吗?? :D
    【解决方案3】:

    是的,首先要注意的也是最明显的一点是您对 SQL 注入 的脆弱性。

    Please, don't use mysql_* functions in new code。它们不再维护,deprecation process 已开始使用。看到red box?改为了解prepared statements,并使用PDOMySQLi - this article 将帮助您决定哪个。如果你选择 PDO,here is a good tutorial

    此外,将逻辑与表示分离(即 PHP 与 HTML)被认为是一种很好的做法。

    【讨论】:

    • 我如何将它比我在这里做得更多?
    • @PatrickReck:嗯,您的 viewtemplate 上只需要很少的 PHP 代码(这就是它的名称)。表单处理、繁重的业务逻辑、数据库交互,这些都应该在它们自己的文件中,并且它们的 HTML 输出为零。
    猜你喜欢
    • 1970-01-01
    • 2011-04-06
    • 2013-01-14
    • 1970-01-01
    • 2012-05-22
    • 1970-01-01
    • 1970-01-01
    • 2011-08-28
    • 2013-01-06
    相关资源
    最近更新 更多