Функция SQL INSERT только с PHP - PullRequest
       4

Функция SQL INSERT только с PHP

0 голосов
/ 09 октября 2018

edit Я изменил код на ответ на предложение, все фрагменты теперь обновлены

В настоящее время я играю с PHP.Поэтому я пытаюсь построить программу, которая может выполнять команды SQL.Итак, я пытаюсь написать некоторые функции, которые будут выполнять запрос.Но я пришел к тому, что не смогу выручить себя.Моя проблема в том, что для команды INSERT INTO я хочу дать массив, содержащий данные, которые должны быть вставлены, но я просто не могу понять, как это сделать.

Вот что я получил и чтоЯ думаю, что имеет отношение к этой операции

Во-первых, функция I хочу для создания

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'));

Мой результат

INSERT INTO adressen (имя, фамилия) ЗНАЧЕНИЯ (привет, du) не удалось

Что я хочу увидеть

success

и, конечно, только что вставленные значения в базе данных

Ответы [ 3 ]

0 голосов
/ 09 октября 2018

При работе с реляционными базами данных необходимо учитывать несколько моментов, не используя PDO:

  • Какую базу данных вы используете.

    Вы решаете выбирать из MySQL, postgreSQL, SQLite и т. Д., Но разные БД обычно имеют разный синтаксис для вставки и выбора данных, а также других операций.Также вам могут понадобиться разные классы и функции для взаимодействия с ними.При этом вы ознакомились с официальным руководством по PHP?Например, Обзор PHP-приложения, которое должно взаимодействовать с базой данных MySQL .

  • Какую цель вы пытаетесь выполнить?

    Полезно сначала создать свой SQL, прежде чем возиться с реальными кодами.Проверьте правильность синтаксиса SQL.Если вы можете запустить SQL в своей базе данных, тогда вы можете попытаться реализовать свой код следующим образом.

  • Как правильно сформировать SQL-запрос в вашем коде?

    В вашей локальной среде разработки можно бездельничать, но вы обязательно должны научиться использовать подготовленные операторы для предотвращения возможных атак SQL-инъекций.

    Также узнайте больше о массивах в PHP: Массивы в PHP .Вы можете использовать пары ключ-значение в цикле foreach:

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

Вам не нужно создавать запрос в самом цикле.Вы используете цикл только для построения строки полей запроса и строки VALUES.Будьте очень осторожны при построении списка VALUES, потому что ваши поля могут иметь разные типы, и вы должны добавлять двойные кавычки вокруг значений строковых полей.И ДА, вы пройдете через все эти неприятности, когда будете делать что-то «вручную».Если вы используете параметры запроса или PDO или любой другой продвинутый драйвер, это может быть намного проще.

После этого вы можете просто объединить значения, чтобы сформировать запрос SQL.

Как только вы познакомитесь с самим языком и базой данных, с которой вы играете, вам определенно станет удобнее.Удачи!

0 голосов
/ 09 октября 2018

Благодаря ответу @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');
0 голосов
/ 09 октября 2018

Это внутри класса?Я предполагаю, что свойство 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";
    }
  }
}

Это довольно простой подход, при котором вы циклически просматриваете данные и делаете запрос для каждой строки, но это не так.t очень эффективно, если у вас большие наборы данных.Другой подход заключается в том, чтобы сделать все сразу, подключив запрос в цикле и отправив его позже (обратите внимание, что начальный массив отличается):

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";
}

}

КстатиДраконий разум - это правильно, вам следует провести некоторую дезинфекцию для хорошей практики, даже если вы не делаете это публично.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...