我正在用PHP OOP编写代码,我正在尝试发送$ _POST数据 由一个Class函数过滤到另一个将要添加的Class函数 数据到数据库。注册时具体登录和密码 形成。
我有3个类可以做到:
是否会过滤即将到来的$ _POST-s:
class Filter extends Dbconnect {
protected $login;
protected $haslo;
public function regFilter() {
if (isset($_POST))
{
foreach($_POST as $key => $val)
{
$filterVal = strip_tags($val);
$filterVal = htmlspecialchars($filterVal);
$filterVal = stripslashes($filterVal);
$filterVal = str_replace("\\", "", $filterVal);
$filter = array(
$key => $filterVal
);
foreach($filter as $key => $val)
{
echo "[$$key]";
echo "$val";
$
{
$key
} = $val;
}
}
return $filter = array(
'login' => $login,
'haslo' => $haslo
);
}
else
{
echo "Proszę podać login i hasło!";
}
}
}
将获取登录名和密码并将其发送给DB的类:
class Dbinsert extends regFilter{
//protected $login;
//protected $haslo;
protected $query;
protected $dbo;
public function insert(){
//$this->extract = extract($filter);
//$this->login = $login;
//$this->haslo = $haslo;
$this->connect();
$this->query = "INSERT INTO uzytkownik (id, nazwa, haslo) VALUES ('', :login, OLD_PASSWORD(:haslo))";
if(!$result = $this->connect()->prepare($this->query)){
echo 'Zapytanie nie powiodło się';
}
else{
$result->bindParam(':login', $login);
$result->bindParam(':haslo', $haslo);
$login = $_POST['login'];
$haslo = $_POST['haslo'];
$result->execute();
}
$dbo = null;
}
}
现在,当我尝试从包含对象的表单发送数据时:
$rejestruj = new Dbinsert();
$filtruj = $rejestruj->regFilter();
var_dump($filtruj);
$dodaj = $filtruj->insert();
我得到以下结果:
[$login]login
[$haslo]password123
array(2) { ["login"]= string(5) "login" ["haslo"]= string(11) "password123" }
Fatal error: Call to a member function insert() on array in `E:\Xampp\htdocs\php\bazy_danych\obiektowe\my\register.php` on line 78
从那以后我不会感到惊讶:login和haslo从中返回 类Filter中的“foreach”循环(仅用于测试)“array(2)” 从“var_dump($ filtruj);”返回(以检查它是否实际 因为我向Class发送一个数组,所以返回错误 Dbinsert - 但在函数中我把“extract”用来获取变量。
如何将此筛选数组中的变量仅发送到类 Dbinsert?
编辑:正如@Twinfriends建议我更正了Dbinsert类中的函数insert以实际使用预准备语句,这就是为什么(现在)login和haslo变量正在reffering到$ _POST。现在我需要回答我的问题。
(第一次发帖,感谢编辑建议,也感谢任何建议,因为我是初学者 在PHP)
答案 0 :(得分:0)
很抱歉,花了这么长时间才回答,我完全忘记了你的问题。好吧,让我们来看看你的问题,希望能解决它。
我尽力解释它,以便你了解最新情况。首先,让我们看看你的错误信息
致命错误:在数组中调用成员函数insert() 第78行
E:\Xampp\htdocs\php\bazy_danych\obiektowe\my\register.php
好。调用数组上的函数...让我们看看你实际调用函数的方式:
$rejestruj = new Dbinsert();
$filtruj = $rejestruj->regFilter();
var_dump($filtruj);
$dodaj = $filtruj->insert();
这就是你的错误。您必须了解您调用对象上的方法并将数据传递给此方法,而不是调用数据上的方法。我的意思是什么?
$rejestruj
是您的Dbinsert对象。您可以在此处的第一行代码中创建它。然后,在其上调用regFilter函数。还是一切都很好。如您所见,var_dump
为您提供了预期的结果。所以错误必须在你的最后一段代码上。实际上,您尝试在阵列上调用方法insert()
。这不会起作用,因为你的阵列不知道任何名为insert()
的方法。
对该方法的正确调用将是(不是最后一个!!!):
$dodaj = $rejestruj->insert();
现在方法调用应该有效。但事实上,它不会插入任何东西。为什么?因为您的insert()
方法尝试绑定变量$login
和$haslo
- 这两个方法并不知道。所以我们需要传递方法中的数据。为此,您必须进行以下更改:
方法调用:
$rejestruj->insert($filtruj); // $filtruj contains your array
您的Dbinsert应该如下所示:
class Dbinsert extends Dbconnect{
protected $query;
protected $dbo;
public function insert($data){
$this->connect();
$this->query = "INSERT INTO uzytkownik (id, nazwa, haslo) VALUES ('', :login, OLD_PASSWORD(:haslo))";
if(!$result = $this->connect()->prepare($this->query)){
echo 'Zapytanie nie powiodło się';
}
else {
$result->bindParam(':login', $data["login"]);
$result->bindParam(':haslo', $data["haslo"]);
$result->execute();
}
$dbo = null;
}
}
我希望您的代码适用于此更改。所以,虽然在我看来代码应该现在可以工作,但我想提一下,你可以改进很多东西。例如,您没有编程真实的"面向对象的" ......你在这里写的更多一些伪OOP。有些事情是非常糟糕的做法(可以做得更容易)。我不想深入细节,因为我不知道你是否对它感兴趣。如果你愿意,我可以给你一些建议,但只有你愿意。
否则我真的希望我的回答可以帮到你。如果整件事情仍然无效,请告诉我,以便我再看一遍。
度过愉快的一天;)
修改强>
因为看起来我还不够清楚,这里的代码现在看起来应该是这样的:
$rejestruj = new Dbinsert();
$filtruj = $rejestruj->regFilter();
$dodaj = $rejestruj->insert($filtruj);