【问题标题】:Confused in Object Oriented Programming in PHP对 PHP 中的面向对象编程感到困惑
【发布时间】:2014-05-22 10:01:29
【问题描述】:

我还是 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>

【问题讨论】:

  • 好的,你已经创建了类。但是创建类实例和调用方法的代码在哪里呢?例如。 $o = new Insert(); $o-&gt;post();
  • 哦,我没有这些,我该怎么做?请帮忙?谢谢你的回复..
  • 在你的表单动作文件中首先创建一个 Class Insert Like $obj = new Insert(); 的实例,调用方法 post like $obj-&gt;post()。您必须将 connectDatabase 方法调用到 post 方法中。你可以看到结果。那么
  • 感谢@biswajitGhosh 对我的帮助! :)

标签: php html sql-server oop


【解决方案1】:

如 cmets 中所说,在文件底部,您需要添加:

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

但我又发现了 1 个问题,导致 SQL 注入漏洞。你需要改变:

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

进入:

    VALUES 
    (
        ?,
        ?,
        ?
    )";

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

编辑:

您还需要从函数内部删除public $conn;。在函数内声明的变量在该函数内是作用域的,因此不能是公共的。如果要声明一个公共变量,请在类内部但在函数外部对其进行标记。像这样:

class Connection {

    public $conn;

    public function connectDatabase() {
        // ...

【讨论】:

  • 感谢@nl-x 的帮助!
  • @JosephRojas 考虑对有帮助的答案进行投票,并通过勾选旁边的复选框来选择其中一个作为接受的答案。
【解决方案2】:

缺少实例化代码。

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

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

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

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

  • 在connect Database方法中使用参数传递db参数($user$pass$host等)
  • 合并 2 个类,因为您只有 2 个方法,而且它们之间的联系非常紧密。

【讨论】:

  • 感谢您的帮助@Thibault :)
  • 最后一个问题是否可以?为什么我运行程序时会出错?这是我的错误:Parse error: syntax error, unexpected 'public' (T_PUBLIC) in C:\wamp\www\process.php on line 14我的第 14 行是:public $conn;提前谢谢!
  • @JosephRojas 我已经编辑了我的答案,并为这个最新问题添加了解决方案
【解决方案3】:

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

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

class Connection {
    private $conn;

// ... the rest of your class
}

那么您需要使用$this-&gt;conn 而不是$conn 来访问它。这样您就可以在类中的所有函数中使用该变量。

样品:

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

【讨论】:

  • 谢谢@Gerald Schneider :) 耶!我的程序运行。
  • 我认为它不适用于 private ,是吗?您需要将其设置为protectedpublic
猜你喜欢
  • 1970-01-01
  • 2018-06-15
  • 1970-01-01
  • 2014-11-28
  • 2018-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多