Web

Как вставить массив в базу данных MySQL с помощью PHP

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

$insData = array(

    'uid' => $fbme['id'],

    'first_name' => $fbme['first_name'],

    'last_name' => $fbme['last_name'],

    'email' => isset($fbme['email']) ? $fbme['email'] : '',

    'link' => $fbme['link'],

    'affiliations' => $networks,

    'birthday' => $info[0]['birthday_date'],

    'current_location' => isset($fbme['location']['name']) ? $fbme['location']['name'] : '',

    'education_history' => $education,

    'work' => $workInfo,

    'hometown_location' => isset($fbme['hometown']['name']) ? $fbme['hometown']['name'] : '',

    'interests' => $info[0]['interests'],

    'locale' => $info[0]['locale'],

    'movies' => $movies,

    'music' => $music,

    'political' => $info[0]['political'],

    'relationship_status' => $info[0]['relationship_status'],

    'sex' =>  isset($fbme['gender']) ? $fbme['gender'] : '',

    'tv' => $television,

    'status' => '0',

    'created' => $now,

    'updated' => $now,

);

Я пробовал искать в Google, как это сделать, и все, что я могу найти, это информация о том, что мой массив необходимо разделить перед вставкой в таблицу. Это верно? Извините за наивность, но я новичок в php.

 

 Ответ 1

Вы не можете вставить массив непосредственно в MySQL, поскольку MySQL не понимает типы данных PHP. MySQL понимает только SQL. Итак, чтобы вставить массив в базу данных MySQL, вы должны преобразовать его в оператор SQL. Это можно сделать вручную или с помощью библиотеки. Результатом должно быть выражение INSERT. Вот стандартный оператор вставки MySQL:

INSERT INTO TABLE1(COLUMN1, COLUMN2, ....) VALUES (VALUE1, VALUE2..)

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

$columns = implode(", ",array_keys($insData));

$escaped_values = array_map('mysql_real_escape_string', array_values($insData));

$values = implode(", ", $escaped_values);

$sql = "INSERT INTO `fbdata`($columns) VALUES ($values)";

 

 Ответ 2

Вот мое полное решение на основе принятого ответа. Пример использования:

include("./assets/php/db.php");

$data = array('field1' => 'data1', 'field2'=> 'data2');

insertArr("databaseName.tableName", $data);

db.php

<?PHP

/**

 * Класс для инициирования нового соединения с MySQL на основе настроек $dbInfo, найденных в dbSettings.php

 *

 * @example

 * $db = new database(); // Инициируем новое соединение с базой данных

 * mysql_close($db->get_link())

 */

class database{

    protected $databaseLink;

    function __construct(){

        include "dbSettings.php";

        $this->database = $dbInfo['host'];

        $this->mysql_user = $dbInfo['user'];

        $this->mysql_pass = $dbInfo['pass'];

        $this->openConnection();

        return $this->get_link();

    }

    function openConnection(){

    $this->databaseLink = mysql_connect($this->database, $this->mysql_user, $this->mysql_pass);

    }

 

    function get_link(){

    return $this->databaseLink;

    }

}

 

/**

 * Вставка ассоциативного массива в базу данных MySQL

 *

 * @example

 * $data = array('field1' => 'data1', 'field2' => 'data2');

 * insertArr("databaseName.tableName", $data);

 */

function insertArr($tableName, $insData){

    $db = new database();

    $columns = implode(", ",array_keys($insData));

    $escaped_values = array_map('mysql_real_escape_string', array_values($insData));

    foreach ($escaped_values as $idx=>$data) $escaped_values[$idx] = "'".$data."'";

    $values = implode(", ", $escaped_values);

    $query = "INSERT INTO $tableName ($columns) VALUES ($values)";

    mysql_query($query) or die(mysql_error());

    mysql_close($db->get_link());

}

?>

dbSettings.php

<?PHP

$dbInfo = array(

    'host'      => "localhost",

    'user'      => "root",

    'pass'      => "password"

);

?>

 

Ответ 3

<?php

 function mysqli_insert_array($table, $data, $exclude = array()) {

    $con= mysqli_connect("localhost", "root","","test");

     $fields = $values = array();

    if( !is_array($exclude) ) $exclude = array($exclude);

    foreach( array_keys($data) as $key ) {

        if( !in_array($key, $exclude) ) {

            $fields[] = "`$key`";

            $values[] = "'" . mysql_real_escape_string($data[$key]) . "'";

        }

    }

    $fields = implode(",", $fields);

    $values = implode(",", $values);

    if( mysqli_query($con,"INSERT INTO `$table` ($fields) VALUES ($values)") ) {

        return array( "mysql_error" => false,

                      "mysql_insert_id" => mysqli_insert_id($con),

                      "mysql_affected_rows" => mysqli_affected_rows($con),

                      "mysql_info" => mysqli_info($con)

                    );

    } else {

        return array( "mysql_error" => mysqli_error($con) );

    }

}

 

 $a['firstname']="abc";

 $a['last name']="xyz";

 $a['birthdate']="1993-09-12";

 $a['profilepic']="img.jpg";

 $a['gender']="male";

 $a['email']="abc@hightecit.com";

 $a['likechoclate']="Dm";

 $a['status']="1";

$result=mysqli_insert_array('registration',$a,'abc');

if( $result['mysql_error'] ) {

    echo "Ошибка в запросе: " . $result['mysql_error'];

} else {

    echo "Запрос выполнен успешно! <br />";

    echo "<pre>";

    print_r($result);

    echo "</pre>";

}

?>


Ответ 4

Может быть, ответ на этот вопрос будет сложным, но он наверняка сработает для вас. Я создал два класса для обработки не только вставки массива, но и запросов к базе данных, обновления и удаления файлов. Класс MySqliConnection используется для создания только одного экземпляра подключения к базе данных (для предотвращения дублирования новых объектов).

<?php

    /**

     *

     * Подключение к базе данных MySQLi: разрешено только одно подключение

     */

    class MySqliConnection{

        public static $_instance;

        public $_connection;

 

        public function __construct($host, $user, $password, $database){

            $this->_connection = new MySQLi($host, $user, $password, $database);

            if (isset($mysqli->connect_error)) {

                echo "Failed to connect to MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error;

                echo $mysqli->host_info . "\n";

            }

        }

 

        /*

        * Получает экземпляр соединения с базой данных

        * @return (MySqliConnection) Object (Объект MySqliConnection)

        */

        public static function getInstance($host, $user, $password, $database){

            if(!self::$_instance){ 

                self::$_instance = new self($host, $user, $password, $database); //если экземпляр не был создан - новый экземпляр будет инициализирован

            }

            return self::$_instance; //возвращает уже завершившийся экземпляр соединения с базой данных

        }

 

        /*

        * Prevent database connection from bing copied while assignig the object to new wariable

        * @return (MySqliConnection) Object

        */

        public function getConnection(){

            return $this->_connection;

        }

 

        /*

        * Предотвращает копирование/дублирование соединения с базой данных при присвоении объекта новому переменному

        * @return nothing

        */

        function __clone(){

        }

    }

 

 

    /*// ПРИМЕР ИСПОЛЬЗОВАНИЯ КЛАССА 

        $db = MySqliConnection::getInstance('localhost', 'root', '', 'sandbox');

        $mysqli = $db->getConnection();

        $sql_query = 'SELECT * FROM users;

            $this->lastQuery = $sql_query;

            $result = $mysqli->query($sql_query);

        while($row = $result->fetch_array(MYSQLI_ASSOC)){

            echo $row['ID'];

        }

 

 */

 Второй класс TableManager немного сложнее. Он также использует класс MySqliConnection, который я опубликовал выше. Поэтому вам придется включить оба эти класса в свой проект. TableManager позволит вам легко обновлять и удалять вставки. Класс имеет отдельный заполнитель для чтения и записи.

<?php

 /*

* ЗАВИСИМОСТИ:

* include 'class.MySqliConnection.inc'; //custom class

*

*/

class TableManager{

    private $lastQuery;

    private $lastInsertId;

    private $tableName;

    private $tableIdName;

    private $columnNames = array();

    private $lastResult = array();

    private $curentRow = array();

    private $newPost = array();

    /*

    * Конструктор класса 

    * [1] (string) $tableName // имя таблицы, с которой вы хотите работать

    * [2] (string) $tableIdName // имя поля ID, которое будет использоваться для удаления и обновления записей

    * @return void

    */

    function __construct($tableName, $tableIdName){

        $this->tableIdName = $tableIdName;

        $this->tableName = $tableName;

        $this->getColumnNames();

        $this->curentRow = $this->columnNames;

    }

 

public function getColumnNames(){

    $sql_query = 'SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = "'.$this->tableName.'"';

    $mysqli = $this->connection();

    $this->lastQuery = $sql_query;

    $result = $mysqli->query($sql_query);

    if (!$result) {

        throw new Exception("Database Error [{$this->database->errno}] {$this->database->error}");

    }

    while($row = $result->fetch_array(MYSQLI_ASSOC)){           

        $this->columnNames[$row['COLUMN_NAME']] = null;

    }

}

 

    /*

    * Используется конструктором для установки собственных параметров или виртуального массива curentRow класса

    * [1] (массив) $v

    * @return void

    */

    function setRowValues($v){

        if(!is_array($v)){

            $this->curentRow = $v;

            return true;    

        }

        foreach ($v as $a => $b) {

            $method = 'set'.ucfirst($a);

            if(is_callable(array($this, $method))){

                //if method is callable use setSomeFunction($k, $v) to filter the value

                $this->$method($b);

            }else{

                $this->curentRow[$a] = $b;

            }

        }

    }

 

    /*

    * Используется конструктором для установки собственных параметров или виртуального массива curentRow класса

    * [0]

    * @return void

    */

    function __toString(){

        var_dump($this);

    }

 

    /*

    * Запрос к базе данных для получения информации - Select column in table where column = somevalue

    * [1] (строка) $column_name // название колонки

    * [2] (строка) $quote_pos // искомое значение в указанном столбце

    * @return void

    */

    public function getRow($column_name = false, $quote_post = false){

        $mysqli = $this->connection();

        $quote_post = $mysqli->real_escape_string($quote_post);

        $this->tableName = $mysqli->real_escape_string($this->tableName);

        $column_name = $mysqli->real_escape_string($column_name);

        if($this->tableName && $column_name && $quote_post){

            $sql_query = 'SELECT * FROM '.$this->tableName.' WHERE '.$column_name.' = "'.$quote_post.'"';

            $this->lastQuery = $sql_query;

            $result = $mysqli->query($sql_query);

            if (!$result) {

                throw new Exception("Database Error [{$this->database->errno}] {$this->database->error}");

            }

            while($row = $result->fetch_array(MYSQLI_ASSOC)){

                $this->lastResult[$row['ID']] = $row;

                $this->setRowValues($row);

            }

        }

        if($this->tableName && $column_name && !$quote_post){

            $sql_query = 'SELECT '.$column_name.' FROM '.$this->tableName.'';

            $this->lastQuery = $sql_query;

            $result = $mysqli->query($sql_query);

            if (!$result) {

                throw new Exception("Database Error [{$this->database->errno}] {$this->database->error}");

            }

            while($row = $result->fetch_array(MYSQLI_ASSOC)){           

                $this->lastResult[] = $row;

                $this->setRowValues($row);

            }       

        }

        if($this->tableName && !$column_name && !$quote_post){

            $sql_query = 'SELECT * FROM '.$this->tableName.'';

            $this->lastQuery = $sql_query;

            $result = $mysqli->query($sql_query);

            if (!$result) {

                throw new Exception("Database Error [{$this->database->errno}] {$this->database->error}");

            }

            while($row = $result->fetch_array(MYSQLI_ASSOC)){           

                $this->lastResult[$row['ID']] = $row;

                $this->setRowValues($row);

            }       

        }

    }

 

 

    /*

    * Класс Connection получает экземпляр соединения с БД или, если он не существует, создает его.

    * [0]

    * @return $mysqli

    */

    private function connection(){

        $this->lastResult = "";

        $db = MySqliConnection::getInstance('localhost', 'root', '', 'sandbox');

        $mysqli = $db->getConnection();

        return $mysqli;

    }

 

    /*

    * ...

    * [1] (string) $getMe

    * @return void

    */

    function __get($getMe){

        if(isset($this->curentRow[$getMe])){

            return $this->curentRow[$getMe];

        }else{

            throw new Exception("Ошибка обработки запроса - нет такого свойства в (массиве) $this->curentRow", 1);

        }

    }

    /*

    * ...

    * [2] (string) $setMe, (string) $value

    * @return void

    */

    function __set($setMe, $value){

        $temp = array($setMe=>$value);

        $this->setRowValues($temp);

    }

 

    /*

    * Дамп объекта

    * [0] 

    * @return void

    */

    function dump(){

        echo "<hr>";

        var_dump($this);

        echo "<hr>";

    }

 

    /*

    * Устанавливает значения для массива $this->newPost, который будет вставлен функцией insertNewPost()

    * [1] (array) $newPost //массив avlue, который будет вставлен в $this->newPost

    * @return bolean

    */

    public function setNewRow($arr){

        if(!is_array($arr)){

            $this->newPost = $arr;

            return false;   

        }

        foreach ($arr as $k => $v) {

            if(array_key_exists($k, $this->columnNames)){

                $method = 'set'.ucfirst($k);

                if(is_callable(array($this, $method))){

                    if($this->$method($v) == false){ //если что-то пошло не так

                        $this->newPost = array();//опустошает массив newPost и возвращает false

                        throw new Exception("Возникла проблема при настройке параметров нового сообщения. [Очистка массива]", 1);

                    }

                }else{

                    $this->newPost[$k] = $v;

                }

            }else{

                $this->newPost = array();//опустошает массив newPost и возвращает false

                throw new Exception("Колонка не существует в этой таблице. [Очистка массива]", 1);

            }

        }

    }

 

 

    /*

    * Вставляет новый пост, хранящийся в $this->newPost.

    * [0]

    * @return bolean

    */

    public function insertNewRow(){

        // проверить, установлен ли он, является ли массивом и не равен ли null

        if(isset($this->newPost) && !is_null($this->newPost) && is_array($this->newPost)){

            $mysqli = $this->connection();

            $count_lenght_of_array = count($this->newPost);

            // предварительный запрос на вставку

            $sql_query = 'INSERT INTO '.$this->tableName.' (';

            $i = 1;

            foreach ($this->newPost as $key => $value) {

                $sql_query .=$key;

                if ($i < $count_lenght_of_array) {

                    $sql_query .=', ';

                }

 

                $i++;

             } 

 

            $i = 1;  

            $sql_query .=') VALUES (';

            foreach ($this->newPost as $key => $value) {

                $sql_query .='"'.$value.'"';

                if ($i < $count_lenght_of_array) {

                    $sql_query .=', ';

                }

                $i++;

             }  

            $sql_query .=')';

            var_dump($sql_query);

            if($mysqli->query($sql_query)){

                $this->lastInsertId = $mysqli->insert_id;

                $this->lastQuery = $sql_query;

            }

            $this->getInsertedPost($this->lastInsertId);

        }

    }   

 

    /*

    * функция getInsertedPost запрашивает последний вставленный id и присваивает его объекту.

    * [1] (целое число) $id // последний вставленный идентификатор из функции insertNewRow.

    * @return void

    */

    private function getInsertedPost($id){

        $mysqli = $this->connection();

        $sql_query = 'SELECT * FROM '.$this->tableName.' WHERE '.$this->tableIdName.' = "'.$id.'"';

        $result = $mysqli->query($sql_query);

        while($row = $result->fetch_array(MYSQLI_ASSOC)){

            $this->lastResult[$row['ID']] = $row;

            $this->setRowValues($row);

        }       

    }

 

    /*

    * функция getInsertedPost запрашивает последний вставленный id и присваивает его объекту.

    * [0]

    * @return bolean // если удаление прошло успешно, возвращается true

    */

    public function deleteLastInsertedPost(){

        $mysqli = $this->connection();

        $sql_query = 'DELETE FROM '.$this->tableName.' WHERE '.$this->tableIdName.' = '.$this->lastInsertId.'';

        $result = $mysqli->query($sql_query);

        if($result){

            $this->lastResult[$this->lastInsertId] = "deleted";

            return true;

        }else{

            throw new Exception("Мы не смогли удалить последнюю вставленную запись по ID [{$mysqli->errno}] {$mysqli->error}");

        }

        var_dump($sql_query);       

    }

 

    /*

    * функция deleteRow удаляет строку из таблицы на основе переданного id

    * [1] (целое число) $id // id удаляемой строки таблицы

    * @return bolean // если удаление прошло успешно, возвращается true

    */

    public function deleteRow($id){

        $mysqli = $this->connection();

        $sql_query = 'DELETE FROM '.$this->tableName.' WHERE '.$this->tableIdName.' = '.$id.'';

        $result = $mysqli->query($sql_query);

        if($result){

            $this->lastResult[$this->lastInsertId] = "deleted";

            return true;

        }else{

            return false;

        }

        var_dump($sql_query);       

    }

 

    /*

    * функция deleteAllRows удаляет все строки из таблицы

    * [0]

    * @return bolean // если удаление прошло успешно, возвращается true

    */

    public function deleteAllRows(){

        $mysqli = $this->connection();

        $sql_query = 'DELETE FROM '.$this->tableName.'';

        $result = $mysqli->query($sql_query);

        if($result){

            return true;

        }else{

            return false;

        }       

    }

 

    /*

    * функция updateRow обновляет все значения до значений объекта в строке с id

    * [1] (целое число) $id

    * @return bolean // если удаление прошло успешно, возвращается true

    */

    public function updateRow($update_where = false){

        $id = $this->curentRow[$this->tableIdName];

        $mysqli = $this->connection();

        $updateMe = $this->curentRow;

        unset($updateMe[$this->tableIdName]);

        $count_lenght_of_array = count($updateMe);

        // предварительный запрос на вставку

        $sql_query = 'UPDATE '.$this->tableName.' SET ';

        $i = 1;

        foreach ($updateMe as $k => $v) {

            $sql_query .= $k.' = "'.$v.'"';

            if ($i < $count_lenght_of_array) {

                $sql_query .=', ';

            }

            $i++;

         }

        if($update_where == false){ 

            //обновление строки только для данного идентификатора объекта

            $sql_query .=' WHERE '.$this->tableIdName.' = '.$this->curentRow[$this->tableIdName].'';

        }else{

            //добавьте свой пользовательский запрос update where

            $sql_query .=' WHERE '.$update_where.'';

        }

        var_dump($sql_query);

        if($mysqli->query($sql_query)){

            $this->lastQuery = $sql_query;

        }

        $result = $mysqli->query($sql_query);

        if($result){

            return true;

        }else{

            return false;

        }       

    }

 

}

 

/*TO DO

 

1 insertPost(X, X) функция записи данных в базу данных;

2 улучшает систему запросов и отображения данных из базы данных;

3 функция, которая отображает данные объекта, а не базы данных;

// Обновление постов до текущего объекта $this->curentRow values

->updatePost();

// Удаление поста curent по ID

// Добавление новой строки в базу данных

*/

/*

ПРИМЕР ИСПОЛЬЗОВАНИЯ

$Post = new TableManager("post_table", "ID"); // New Object

// Получение сообщений из базы данных на основе введенных параметров

$Post->getRow('post_name', 'SOME POST TITLE WHICH IS IN DATABASE' );

$Post->getRow('post_name');

$Post->getRow();

 

MAGIC GET будет читать значения параметров текущего объекта $this->curentRow, ссылаясь на его ключ, как в имени переменной

echo $Post->ID.

echo $Post->post_name;

echo $Post->post_description;

echo $Post->post_author;

 

$Task = new TableManager("table_name", "table_ID_name"); // создание нового объекта TableManager

$addTask = array( //just an array [colum_name] => [values]

    'task_name' => 'New Post',

    'description' => 'New Description Post',

    'person' => 'New Author',

    );

$Task->setNewRow($addTask); //подготовить новые значения для вставки в таблицу

$Task->getRow('ID', '12'); //загрузить значение из таблицы в объект

$Task->insertNewRow();// вставляет новую строку

$Task->dump();//отображает свойства объекта

$Task->person = "John"; //магический метод __set() будет искать метод setPerson(x,y), если он не найден, то присвоит значение как есть. 

$Task->description = "John Doe is a funny guy"; //magic __set() еще раз

$Task->task_name = "John chellange"; //magic __set() еще раз

$test = ($Task->updateRow("ID = 5")) ? "WORKS FINE" : "ERROR"; //обновление строки cutom значениями объектов

echo $test;

$test = ($Task->updateRow()) ? "WORKS FINE" : "ERROR"; //обновление текущих данных, загруженных в объект

echo $test;

*/

 

Схожие статьи

Web

Что лучше использовать при освобождении памяти в PHP: unset() или $var=null

Web

Как получить массив ввода формы в массив PHP

Web

Как заставить PHP перестать заменять символы «.» в массивах $_GET или $_POST

Web

PHP - сбросить свойства объектов в массиве после вызова array_filter

×