sql插入函数,仅限php

kmb7vmvb  于 2021-06-18  发布在  Mysql
关注(0)|答案(3)|浏览(337)

编辑我把代码改成了建议答案,所有的代码片段现在都更新了
目前我正在玩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(nachname,vorname)值(hallo,du)失败
我想看到的
成功
当然还有数据库中新插入的值

3htmauhk

3htmauhk1#

在使用关系数据库而不使用 PDO :
你正在使用的数据库是什么。
这是你的选择 MySQL , postgreSQL , SQLite 等等,但是不同的数据库通常有不同的语法来插入和选择数据,以及其他操作。此外,您可能需要不同的类和函数来与它们交互。也就是说,你查过php的官方手册了吗?例如,需要与mysql数据库交互的php应用程序概述。
你想要达到的目标是什么?
在处理实际代码之前,先构造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 查询。
一旦你对语言本身和你正在使用的数据库更加熟悉,你肯定会感觉更舒服。祝你好运!

cld4siwp

cld4siwp2#

这是在教室里吗?我假设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";
}

}
顺便说一句,你的想法是正确的,你应该做一些良好的做法,即使你不公开消毒。

nzk0hqpo

nzk0hqpo3#

多亏了@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');

相关问题