仅使用PHP的SQL INSERT函数

时间:2018-10-09 08:10:52

标签: php mysql sql oop mysqli

编辑,我将代码更改为建议答案,所有代码段现已更新

目前,我正在玩PHP。因此,我试图建立一个可以执行SQL命令的程序。因此,我正在尝试编写一些将执行查询的函数。但是我到了无法忍受自己的地步。我的麻烦是,对于INSERT INTO命令,我想给出一个数组,其中包含要插入的数据,但我根本不知道如何执行此操作。

这是我得到的,并且我认为与此手术有关的

首先,我想要创建的功能

public function actionInsert($data_values = array())
{
    $db = $this->openDB();
    if ($db) {

        $fields = '';
        $fields_value = '';
        foreach ($data_values as $columnName => $columnValue) {
            if ($fields != '') {
                $fields .= ',';
                $fields_value .= ',';
            }
            $fields .= $columnName;
            $fields_value .= $columnValue;
        }
        $sqlInsert = 'INSERT INTO ' . $this->tabelle . ' (' . $fields . ') VALUES (' . $fields_value . ')';
        $result = $db->query($sqlInsert);
        echo $sqlInsert;
        if ($result) {

            echo "success";
        } else {

            echo "failed";
        }

    }
}

这就是我过滤值的方式

<?php
require_once 'funktionen.php';

$adresse = new \DB\Adressen();

$adresse->actionInsert(array('nachname'=>'hallo', 'vorname'=>'du'));

我的结果

  

向地址中插入adressen(别名,vorname)值(hallo,du)失败

我希望看到的东西

  

成功

当然还有数据库中新插入的值

3 个答案:

答案 0 :(得分:0)

这是在课堂内吗?我认为tabelle属性设置正确。 也就是说,您应该更正foreach循环,该循环使用不正确:

public function actionInsert($data_values) //$data_values should be an array
{
$db = $this->openDB();

if ($db) {

foreach ($data_values as $data){
    // $data_values could be a bidimensional array, like 
    // [
    //   [field1=> value1, field2 => value2, field3 => value3],
    //   [field1=> value4, field2 => value5, field3 => value6],
    //   [field1=> value7, field2 => value8, field3 => value9],
    // ]
    $fields = Array();
    $values = Array();
    foreach($data as $key => $value){
      array_push($fields,$key);
      array_push($values,"'$value'");
    }
    $sqlInsert = 'INSERT INTO ' . $this->tabelle . ' (' . join(',',$fields) . ') VALUES (' . join(',',$values) . ')';  
    $result = $db->query($sqlInsert);
    echo $sqlInsert;

    if ($result) {
      echo "success";
    } else {
      echo "failed";
    }
  }
}

这是一种相当基本的方法,其中您可以循环浏览数据并针对每一行进行查询,但是如果您拥有大型数据集,则效果不佳。 另一种方法是通过将查询装入循环并稍后发送(请注意起始数组是不同的)来一次完成所有操作:

public function actionInsert($data_values) //$data_values should be an array
{

$db = $this->openDB();

if ($db) {
$vals = Array();
foreach ($data_values['values'] as $data){

    // $data_values could be an associative array, like 
    // [
    //   fields => ['field1','field2','field3'],
    //   values => [
    //              [value1,value2,value3],
    //              [value4,value5,value6],
    //              [value7,value8,value9]
    //             ]
    // ]

  array_push('('.join(',',"'$data'").')',$vals);
}

$sqlInsert = 'INSERT INTO ' . $this->tabelle . ' (' . join(',',$data_values['fields']) . ') VALUES '.join(' , ',$vals);  

$result = $db->query($sqlInsert);
echo $sqlInsert;

if ($result) {
  echo "success";
} else {
  echo "failed";
}

}

通过Dragonthought的正确方法,即使您不公开,也应该对某种良好习惯的做法进行消毒。

答案 1 :(得分:0)

在不使用PDO的情况下使用关系数据库时,需要考虑以下几点:

  • 您正在使用的数据库是什么。

    由您决定从MySQLpostgreSQLSQLite等中进行选择,但是不同的DB通常具有用于插入和选择数据以及其他操作的不同语法。另外,您可能需要不同的类和函数才能与它们进行交互。  话虽如此,您是否签出了PHP的官方手册?例如,An overview of a PHP application that needs to interact with a MySQL database

  • 您要实现的目标是什么?

    在弄乱实际代码之前先构造SQL是很有帮助的。检查您的SQL语法是否正确。如果您可以在数据库中运行SQL,则可以尝试接下来实现代码。

  • 在您的代码中形成SQL查询的正确方法是什么?

    可以在本地开发环境中随意摆弄,但是您绝对应该学习如何使用准备好的语句来防止可能的SQL注入攻击。

    还了解有关PHP中数组的更多信息:Arrays in PHP。您可以在foreach循环中使用键值对:

    foreach ($keyed_array as $key => $value) {
        //use your key and value here
    }
    

您不需要在循环本身中构造查询。您仅使用循环来构造查询字段字符串和VALUES字符串。构造VALUES列表时请格外小心,因为您的字段可以具有不同的类型,并且应该在字符串字段值周围添加双引号。是的,当您“手动”执行操作时,您将遇到所有这些麻烦。如果您使用查询参数或PDO或任何其他高级驱动程序,则可能会容易得多。

之后,您只需将值连接起来即可构成SQL查询。

一旦您更加熟悉语言本身和正在使用的数据库,您肯定会感到更加自在。祝你好运!

答案 2 :(得分:0)

由于@Eagle L的回答,我找到了一种最终可行的方法。这与我最初尝试的方法有所不同,但是如果有人遇到类似的麻烦,我希望这可以帮助他。

 //get the Values you need to insert as required parameters
public function actionInsert($nachname, $vorname, $plz, $wohnort, $strasse)
{
    //database connection
    $db = $this->openDB();
    if ($db) {

        //use a prepared statement
        $insert = $db->prepare("INSERT INTO adressen (nachname, vorname, plz, wohnort, strasse) VALUES(?,?,?,?,?)");


            //fill the Values
            $insert->bind_param('ssiss', $nachname, $vorname, $plz, $wohnort, $strasse);

            //but only if every Value is defined to avoid NULL fields in the Database
            if ($vorname && $nachname && $plz && $wohnort && $strasse) {

已编辑

                $inserted = $insert->execute(); //added $inserted

                //this is still clumsy and user unfriendly but serves my needs 
                if ($inserted) {//changed $insert->execute() to $inserted
                    echo 'success';

                } else {

                    echo 'failed' . $inserted->error;
                }
            }

    }

}

和函数调用

<?php
require_once 'funktionen.php';

$adresse = new \DB\Adressen();

$adresse->actionInsert('valueWillBe$nachname', 'valueWillBe$vorname', 'valueWillBe$plz', 'valueWillBe$wohnort', '$valueWillBe$strasse');