如何在 php 中将数组值作为键值对插入到数据库表中

Posted

技术标签:

【中文标题】如何在 php 中将数组值作为键值对插入到数据库表中【英文标题】:How to insert array values to a database table as key value pairs in php 【发布时间】:2020-04-30 00:53:36 【问题描述】:

我正在使用数组将数据插入到表调用 z_error_log。这些插入的数据在“数据”列下的表格中为我提供了如下输出。

(user_role,email,nic,password,payment,reg_date)=(2,dfghjkbhjn@gmail.com,123456789045,$2y$10$R4MOTLHlhe1M9GCt0utxQO3d43oFrH.34ivCPPtHpral.cM/kW5sq,0,2020-01-13 14:44:27)

但我真正需要做的是,将这些数据插入到它存储的表中,如下所示。

user_role = 2,email=dfghjkbhjn@gmail.com,nic=123456789045,password=$2y$10$R4MOTLHlhe1M9GCt0utxQO3d43oFrH.34ivCPPtHpral.cM/kW5sq,payment,reg_date=2020-01-13 14:44:27

我需要像上面一样在其名称之后分配值。

在这里,我在 Log_model.php 文件中添加了 Vendor_cont 类的部分和函数,用于将数据输入到 z_error_log 表中。

================Vendor_cont.php====================

class Vendor_cont


//CLASS Content

  
            

            // ===================EDITED If Recaptcha Fail=====================================

             else 

                             $userData = array(
                             'user_role'=>'2',
                             'email' => $email,
                             'nic' => $nic,
                             'password' =>$password,
                             'payment' =>0,
                             'reg_date' =>date('Y-m-d H:i:s')
                          );

                $_SESSION['Emessages'] = 'Recaptcha Failed. Please try again later'; 

                $this->LModel->createErrorLog(3,'Vendor_cont/register_vendor/recaptcha_fail',$email,$userData);


                

        //========================================================================================


==================Log_model.php==================

    public function createErrorLog($user,$function,$error_data,$data_obj) 

            $ip=$_SERVER['REMOTE_ADDR'];
            $browser_os=  $_SERVER['HTTP_USER_AGENT'];

            $data= (array) $data_obj;

            // print_r($data);

            if (is_array($data)) 
                $val = '(' . implode(',', array_keys($data)) . ')';
                $val .= '=(' . implode(',', $data) . ')';
             else 
                $val = $data;
            


    // =============EDITED==============

            $oStmt= $this->oDb->prepare('INSERT INTO z_error_log (`function`, `error_data`,`data`,`user` ,`ip`,`browser_os`) VALUES (:function,:error_data,:data,:user,:ip,:browser_os)');
            $oStmt->bindParam(':function', $function, \PDO::PARAM_STR);
            $oStmt->bindParam(':error_data', $error_data, \PDO::PARAM_STR);
            $oStmt->bindParam(':data', $val, \PDO::PARAM_STR);
            $oStmt->bindParam(':user', $user, \PDO::PARAM_INT);
            $oStmt->bindParam(':ip', $ip, \PDO::PARAM_STR);
            $oStmt->bindParam(':browser_os', $browser_os, \PDO::PARAM_STR);
            $oStmt->execute();

            return  $this->oDb->lastInsertId();

        

非常感谢您的帮助。提前致谢。

【问题讨论】:

将数据编码为 JSON 比发明自己的格式并为其编写代码更容易 这是你的问题吗? ***.com/questions/59704029/… @Dilek,不是我的小组成员之一,我们在一个项目中合作 【参考方案1】:

请使用以下代码修改您的 createErrorLog() 函数。我希望你可以通过使用它得到你想要的输出。

$email = "test@gmail.com";
$nic ="nic";
$password ="Pass@123";

$userData = array(
     'user_role'=>'2',
     'email' => $email,
     'nic' => $nic,
     'password' =>$password,
     'payment' =>0,
     'reg_date' =>date('Y-m-d H:i:s')
);
foreach($userData as $key=>$val) 
    $finalValue .= $key.'='.$val.',';

echo rtrim($finalValue,",");

用下面的代码替换模型文件中的 createErrorLog() 函数就完成了。记得在数据库中创建数据列作为文本类型并将值作为字符串传递。

public function createErrorLog($user,$function,$error_data,$data_obj) 
        $ip=$_SERVER['REMOTE_ADDR'];
        $browser_os=  $_SERVER['HTTP_USER_AGENT'];
        $data= (array) $data_obj;

        foreach($data as $key=>$val) 
            $finalValue .= $key.'='.$val.',';
        
        $val = rtrim($finalValue,",");

        // =============EDITED==============
            $oStmt= $this->oDb->prepare('INSERT INTO z_error_log (`function`, `error_data`,`data`,`user` ,`ip`,`browser_os`) VALUES (:function,:error_data,:data,:user,:ip,:browser_os)');
            $oStmt->bindParam(':function', $function, \PDO::PARAM_STR);
            $oStmt->bindParam(':error_data', $error_data, \PDO::PARAM_STR);
            $oStmt->bindParam(':data', $val, \PDO::PARAM_STR);
            $oStmt->bindParam(':user', $user, \PDO::PARAM_INT);
            $oStmt->bindParam(':ip', $ip, \PDO::PARAM_STR);
            $oStmt->bindParam(':browser_os', $browser_os, \PDO::PARAM_STR);
            $oStmt->execute();
            return  $this->oDb->lastInsertId();
    

【讨论】:

感谢您的支持,但是我不知道如何使用这个并插入到这个表中,请您多解释一下 我已经修改了答案。在 Log_model.php 文件中进行更改 它给了我想要的输出,但它抛出一个错误注意:未定义的变量:C:\xampp\htdocs\promise\e_proc_2\Model\Log_model.php 中的 finalValue 在第 199 行 在 foreach 循环之前初始化这个变量。作为 $finalValue ='';【参考方案2】:

mysql 不理解数组,因此您可以转换为 json 或将每个数据添加到单独的列中 要添加单独的列,您可以使用带有列名的 implode 可以解决问题。您发布的问题非常大,您可以用虚拟代码对其进行修剪吗 另请参考this

【讨论】:

以上是关于如何在 php 中将数组值作为键值对插入到数据库表中的主要内容,如果未能解决你的问题,请参考以下文章

如何在php中将对象数组转换为键值对

如何在php中的数组中插入新的键值对?

如何使用 php/laravel 在现有数组对象中插入键值对?

如何在php中将所有键值合并到一个数组中[重复]

如何将 HTML 表转换为 jQuery 键值对数组?

TP5如何向mongoDB插入一个键值为null!