PHP如何发送数组变量到类函数
我在PHP OOP中编写代码,我试图发送$ _POST数据 由一个Class函数过滤到另一个Class函数,将数据添加到数据库 。具体登录和密码登记 表格。PHP如何发送数组变量到类函数
我有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
这并不让我惊讶,因为:登录和haslo是从 “foreach”循环中类Filter(它只是为了测试)“数组(2)” 从“var_dump($ filtruj);”(以检查它是否实际上是 工作)和错误返回,因为我发送一个数组到类 Dbinsert - 但在函数中,我把“提取”获取变量。
我该如何发送这个滤波后的数组中的变量到类 Dbinsert?
编辑:作为@Twinfriends建议我更正了类Dbinsert中的函数插入以实际使用预准备语句,这就是为什么(现在)登录和haslo变量正在接受$ _POST。现在我需要回答我的问题。
(第一次发帖,感谢编辑的建议,也可以是任何建议表示赞赏,因为我在PHP相当初学者 )
抱歉花了这么长时间来回答,我完全忘了你的问题。那么,让我们看看你的问题,希望解决它。
我试着尽可能地解释它,以便你了解发生了什么事情。首先,让我们看看你的错误信息
Fatal error: Call to a member function insert() on array in
E:\Xampp\htdocs\php\bazy_danych\obiektowe\my\register.php
on line 78
好的。调用阵列上的函数...让我们看看你如何实际调用函数:
$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);
它的工作原理,但我收到一条警告消息: “警告:缺少Dbinsert :: insert()的参数1,在E:\ Xampp \ htdocs \ php \ bazy_danych \ obiektowe \ my中调用\ register.php在第78行,并且在第45行的E:\ Xampp \ htdocs \ php \ bazy_danych \ obiektowe \ my \ test_service.php中定义,我也会真正地对你的主题提供帮助,因为我想进入PHP编程和学习做它应该这样做。 (现在我正慢慢走向Laraver) – korni
@korni你确定你调用的方法像'$ rejestruj-> insert($ filtruj);'?还请检查我所有的变量拼写,因为我手动输入了它们。我可能会误输变量名称,可能会导致此警告。 – Twinfriends
拼写看起来恰到好处。警告消息行: “$ filtruj = $ rejestruj-> insert();” 并在类功能: “公共功能插入($数据){” ,因为它似乎缺少$数据 – korni
请重新格式化您的代码,以便可以阅读它 –
您的查询没有任何意义。 YOu尝试将变量绑定到没有任何占位符的查询。 – Twinfriends
@Twinfriends你可能是对的,因为我的工作方法是编写程序,然后将其转换为OOP。但查询无需过滤功能。 – korni