【问题标题】:INSERT INTO dynamic columns from JSON从 JSON 插入动态列
【发布时间】:2018-09-23 14:10:09
【问题描述】:

这就是我将静态数据插入数据库表的方式:

try {
    $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password, array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'"));
    // set the PDO error mode to exception
    $conn->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING );

    $campaign = (isset($_POST['campaign'])) ? $_POST['campaign'] : null;
    $salutation = $_POST['salutation'];
    $firstname = $_POST['first_name'];
    $lastname = $_POST['surname'];
    $address = $_POST['address'];
    $zipcode = $_POST['zipcode'];
    $location = $_POST['location'];
    $country = $_POST['country'];
    $phone = $_POST['phone'];
    $email = $_POST['email'];
    $date_of_birth = (isset($_POST['day']) && is_numeric($_POST['day']) && isset($_POST['month']) && $_POST['month'] != 'Monat' && isset($_POST['year']) && is_numeric($_POST['year'])) ? $_POST['day'] . '.' . $_POST['month'] . '.' . $_POST['year'] : '';
    $ip = $_SERVER['REMOTE_ADDR'];
    $created_on = time();

    $stmt = $conn->prepare ("INSERT INTO t_weltwoche_address_infos2018_test (salutation, firstname, lastname, address, loctation, country, phone, email, date_of_birth, remoteAddress, createdon) VALUES (:salutation, :firstname, :lastname, :address, :loctation, :country, :phone, :email, :date_of_birth, :remoteAddress, :createdon)");

    $stmt -> bindParam(':salutation', $salutation);
    $stmt -> bindParam(':firstname', $firstname);
    $stmt -> bindParam(':surname', $lastname);
    $stmt -> bindParam(':address', $address);
    $stmt -> bindParam(':loctation', $location);
    $stmt -> bindParam(':country', $country);
    $stmt -> bindParam(':phone', $phone);
    $stmt -> bindParam(':email', $email);
    $stmt -> bindParam(':date_of_birth', $date_of_birth);
    $stmt -> bindParam(':remoteAddress', $ip);
    $stmt -> bindParam(':createdon', $created_on);
    $stmt -> execute();
}
catch(PDOException $e) {
    $conn = null;
    echo $e;
}

这只是一个测试,它似乎有效。现在我想动态地做所有事情。

$json = json_decode(file_get_contents('/srv/www/micro/weltwochen.lasttry.db.json'));

使用 $json 我得到一个 JSON 对象。我对 JSON 文件的值不感兴趣,但我想将它的属性用于我的 MySQL 表的列。

所有 JSON 属性的调用方式与 $_POST[] 的字符串相同。

示例

如果 JSON 有一个名为 first_name 的属性,则插入 $_POST['first_name'] 的值。

我该怎么做?

【问题讨论】:

  • JSON数据文件的格式是什么?

标签: php sql json pdo


【解决方案1】:

您需要为prepare() 构建一个查询字符串。这是使用字符串操作的一种方法。如果您控制并信任 JSON 文件,则此方法是可行的,但如果 JSON 文件来自不安全的源,则此代码可能会通过动态密钥受到SQL injection 的攻击。在这种情况下,我会非常保持警惕。

$json = json_decode(file_get_contents('/srv/www/micro/weltwochen.lasttry.db.json'), true);

$keys = array_keys($json);
$column_names = implode(", ", $keys);
$place_markers = implode(", ", array_map(function($column) {return ':'.$column;}, $keys));
$query = "INSERT INTO t_weltwoche_address_infos2018_test (" . $column_names . ") VALUES (" . $place_markers . ")";

$stmt = $conn->prepare($query);
foreach($keys as $key) {
    $stmt->bindParam($key, $_POST[$key]);
}

【讨论】:

  • JSON 文件是完全可信的。令人惊讶的是你是怎么做到的。非常感谢!
【解决方案2】:

如果您使用传递true 作为json_decode 的可选$assoc 参数...

$json = json_decode( file_get_contents('/srv/www/micro/weltwochen.lasttry.db.json'),
                     true );

然后

$json 变量已包含您要求的格式的数据。

例如。你可以访问$json['first_name']

如果解析的JSON编码数据具有以下格式(键值对的单个对象),上述当然是有效的:

{ 
    "first_name":    "Reza",
    "surname":       "Saadati",
    "address"....

}

如果不是这种情况,则解码后的数组$json 需要“损坏”。如何做到这一点取决于源 JSON 的格式;以防万一,您可以将其包含在答案中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-19
    相关资源
    最近更新 更多