使用PHP将数组插入MySQL数据库

Lia*_*iam 32 php mysql arrays

我有以下要存储在我的数据库中的数组...

$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,
);
Run Code Online (Sandbox Code Playgroud)

我已经尝试搜索谷歌如何做到这一点,所有我能找到的信息表明我的数组需要拆分,然后插入表中.它是否正确?抱歉天真,非常新的PHP.

Shi*_*dim 90

你无法直接将数组插入mysql,因为mysql不了解php数据类型. Mysql只能理解SQL.因此,要将数组插入mysql数据库,必须将其转换为sql语句.这可以手动完成,也可以通过库完成.输出应该是一个INSERT声明.

这是一个标准的mysql插入语句.

INSERT INTO TABLE1(COLUMN1, COLUMN2, ....) VALUES (VALUE1, VALUE2..)
Run Code Online (Sandbox Code Playgroud)

如果您的表名称中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)";
Run Code Online (Sandbox Code Playgroud)

PHP7的更新

由于PHP 5.5 mysql_real_escape_string已被弃用,因此从PHP7开始,它已被删除.请参阅:Php.net有关新过程的文档.

  • 另请注意,您可能必须在`$ values`字符串中添加单引号才能正常工作.`$ values = implode("','",$ escaped_values); $ sql ="INSERT INTO fbdata($ columns)VALUES('$ values')";` (19认同)
  • 请注意,**逃避**您的价值观是非常重要的一步.它阻止[sql注入](http://en.wikipedia.org/wiki/SQL_injection). (3认同)
  • 不要使用`mysql_real_escape_string`,而应该使用`mysqli_real_escape_string`! (3认同)
  • 一个完全工作的PHP代码将不胜感激. (2认同)

rle*_*mon 16

有许多不同的方法......我将举例说明一个使用预处理语句:

$prep = array();
foreach($insData as $k => $v ) {
    $prep[':'.$k] = $v;
}
$sth = $db->prepare("INSERT INTO table ( " . implode(', ',array_keys($insData)) . ") VALUES (" . implode(', ',array_keys($prep)) . ")");
$res = $sth->execute($prep);
Run Code Online (Sandbox Code Playgroud)

我在这里作弊,假设你的第一个数组中的键是SQL表中的列名.我也假设你有PDO可用.更多信息可以在http://php.net/manual/en/book.pdo.php找到

  • 仅适用于可能会看此代码的其他人。经过几次尝试,我才发现在$ prep [':'。$ k] =`之后直接有一个额外的`>`。如果删除大于号,则代码有效。 (2认同)

Fre*_*lip 5

就我个人而言,我会对数组进行 json_encode(考虑到任何需要的转义等)并将整个批次放入适当大小的文本/blob 字段中。

它使存储“非结构化”数据变得非常容易,但却是一个真正的 PITA,可以轻松地搜索/索引。

一个简单的 json_decode 会将数据“分解”回数组中。


cir*_*try 5

以下是基于已接受答案的完整解决方案.

用法示例:

include("./assets/php/db.php");
$data = array('field1' => 'data1', 'field2'=> 'data2');
insertArr("databaseName.tableName", $data);
Run Code Online (Sandbox Code Playgroud)

db.php中

<?PHP
/**
 * Class to initiate a new MySQL connection based on $dbInfo settings found in dbSettings.php
 *
 * @example
 *    $db = new database(); // Initiate a new database connection
 *    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;
    }
}

/**
 * Insert an associative array into a MySQL database
 *
 * @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());
}
?>
Run Code Online (Sandbox Code Playgroud)

dbSettings.php

<?PHP
$dbInfo = array(
    'host'      => "localhost",
    'user'      => "root",
    'pass'      => "password"
);
?>
Run Code Online (Sandbox Code Playgroud)


小智 5

$columns = implode(", ",array_keys($data));
$escaped_values = array_map(array($con, 'real_escape_string'),array_values($data));
$values  = implode("', '", $escaped_values);
return $sql = "INSERT INTO `reservations`($columns) VALUES ('$values')";
Run Code Online (Sandbox Code Playgroud)

这是对 Shiplu Mokaddim 给出的解决方案的改进