PHP如何发送数组变量到类函数

问题描述:

我在PHP OOP中编写代码,我试图发送$ _POST数据 由一个Class函数过滤到另一个Class函数,将数据添加到数据库 。具体登录和密码登记 表格。PHP如何发送数组变量到类函数

我有3类,将做到这一点:

  1. 是处理与数据库的连接(我认为这是没有必要把这里的代码)
  2. 简单类是过滤来的类$ _ 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!"; 
         } 
        } 
    } 
    
  3. 类,将得到用户名和密码,并将其发送给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相当初学者 )

+1

请重新格式化您的代码,以便可以阅读它 –

+0

您的查询没有任何意义。 YOu尝试将变量绑定到没有任何占位符的查询。 – Twinfriends

+0

@Twinfriends你可能是对的,因为我的工作方法是编写程序,然后将其转换为OOP。但查询无需过滤功能。 – korni

抱歉花了这么长时间来回答,我完全忘了你的问题。那么,让我们看看你的问题,希望解决它。

我试着尽可能地解释它,以便你了解发生了什么事情。首先,让我们看看你的错误信息

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); 
+0

它的工作原理,但我收到一条警告消息: “警告:缺少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

+0

@korni你确定你调用的方法像'$ rejestruj-> insert($ filtruj);'?还请检查我所有的变量拼写,因为我手动输入了它们。我可能会误输变量名称,可能会导致此警告。 – Twinfriends

+0

拼写看起来恰到好处。警告消息行: “$ filtruj = $ rejestruj-> insert();” 并在类功能: “公共功能插入($数据){” ,因为它似乎缺少$数据 – korni