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

时间:2017-07-28 09:38:46

标签: php

我正在用PHP OOP编写代码,我正在尝试发送$ _POST数据  由一个Class函数过滤到另一个将要添加的Class函数  数据到数据库。注册时具体登录和密码  形成。

我有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;
    }
    }
    
  4. 现在,当我尝试从包含对象的表单发送数据时:

        $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)

1 个答案:

答案 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);