У меня есть следующий массив, который я хочу сохранить в своей базе данных...
$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