我还是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>
答案 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()
方法,并执行您的代码。
我补充说,您可以在代码中更改一些内容:
$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);