困惑于PHP中的面向对象编程

时间:2014-05-22 10:01:29

标签: php html sql-server oop

我还是PHP的新手,当我做OOP风格时,我似乎无法运行我的简单测试代码。我的简单测试程序所做的就是在数据库中保存您的姓名,年龄和性别。

以前它仍然处于程序风格时运行,但是当我这样做时,OOP风格它不再运行。顺便说一句,我使用MS SQL Server作为我的数据库。

这是我的PHP代码,文件名为process.php

<?php

class Connection {
    public function connectDatabase() {
        $serverName = "localhost"; 
        $uid = "sa";   
        $pwd = "joseph04";  
        $databaseName = "Profile"; 

        $connectionInfo = array( "UID"=>$uid, "PWD"=>$pwd, "Database"=>$databaseName); 

        // Connect using SQL Server Authentication 
        public $conn;
        $conn = sqlsrv_connect( $serverName, $connectionInfo);  

        // Test Connection
        if( $conn === false )
        {
            echo "Connection could not be established.\n";
            die( print_r( sqlsrv_errors(), true));
        }
    }
}

class Insert extends Connection {
    public function post() {
        $Name = $_POST["NAME"];
        $Age = $_POST["AGE"];
        $Sex = $_POST["SEX"];

        $sql = "INSERT INTO dbo.ProfileTable 
        (
            Name,
            Age,
            Sex
        )
        VALUES 
        (
            '$Name',
            '$Age',
            '$Sex'
        )";

        $parameters = array($Name, $Age, $Sex);
        $stmt = sqlsrv_query($conn, $sql, $parameters);

        if( $stmt === false ){
            echo "Statement could not be executed.\n";
            die( print_r( sqlsrv_errors(), true));
        } 
        else {
            echo "Rows affected: ".sqlsrv_rows_affected( $stmt )."\n";
        }
        // Free statement and connection resources
        sqlsrv_free_stmt($stmt);
        sqlsrv_close($conn);
    }
}


?>

这是我的HTML代码:

<!DOCTYPE html>
<html>
   <head>
      <title>Sample Form</title>
      <link href="main1.css" rel="stylesheet" type="text/css">
   </head>

   <body>
      <form method="post" action="process.php">
         <table width="400" border="0">
            <tr>
            <td>Name:</td>
            <td></td>
            <td><input type="text" name = "NAME"></td>
            </tr>
            <tr>
            <td>Age:</td>
            <td></td>
            <td><input type="text" name = "AGE"></td>
            </tr>
            <tr>
            <td>Sex:</td>
            <td></td>
            <td><input type="text" name = "SEX"></td>
            </tr>
         </table>
         <input type="submit" name="formSubmit" value="Submit!"> 
      </form>
   </body>
</html>

3 个答案:

答案 0 :(得分:2)

如评论中所述,在文件底部,您需要添加:

$i = new Insert();
$i->connectDatabase();
$i->post();

但是我发现了另外一个问题,导致SQL注入漏洞。你需要改变:

    VALUES 
    (
        '$Name',
        '$Age',
        '$Sex'
    )";

成:

    VALUES 
    (
        ?,
        ?,
        ?
    )";

因为没有这样做,您将直接将变量注入到查询中,而不会转义它们。并且您将在不使用它们的情况下发送参数。

修改

您还需要从函数内部删除public $conn;。在函数内声明的变量在该函数中作用域,因此不能公开。如果你想声明一个公共变量,那么在类中去掉它,但在函数之外。像这样:

class Connection {

    public $conn;

    public function connectDatabase() {
        // ...

答案 1 :(得分:0)

缺少实例代码。

您可以在process.php文件的末尾添加:

$o = new Insert();
$o->connectDatabase();
$o->post();

$o变量将是Insert类的实例。然后能够调用post()方法,并执行您的代码。

我补充说,您可以在代码中更改一些内容:

  • 使用connect数据库方法中的参数传递db参数($user$pass$host等)
  • 合并这两个类,因为你只有两个方法,并且它们相互关联。

答案 2 :(得分:0)

您的$conn变量存在问题。它只存在于您使用它的函数内部。如果运行Insert::connectDatabase(),则设置该值,但它仅在此函数中可用。 Insert::post()函数具有不同的变量范围,并且无法访问其他函数中的变量。

您需要将其添加到您的基类:

class Connection {
    private $conn;

// ... the rest of your class
}

然后,您需要使用$this->conn而不是$conn来访问它。这样,您就可以在类中的所有函数中使用该变量。

样品:

$this->conn = sqlsrv_connect( $serverName, $connectionInfo);
$stmt = sqlsrv_query($this->conn, $sql, $parameters);