使用 PDO 将 JSON 解码数据插入 mysql

Posted

技术标签:

【中文标题】使用 PDO 将 JSON 解码数据插入 mysql【英文标题】:Insert JSON decoded data into mysql with PDO 【发布时间】:2013-11-14 20:06:09 【问题描述】:

数据库结构:

编码成 JSON:

我使用此代码将一些 JSON 编码的动漫信息存储在文本文件中:

        $info = array(
            'mal_id' => $id,
            'image' => $src,
            'title' => $title,
            'alt_title_eng' => $alt_eng,
            'alt_title_syn' => $alt_syn,
            'type' => $type,
            'status' => $status,
            'episodes' => $ep,
            'genres' => $genres,
            'rank' => $rank,
            'synopsis' => $syno,
            'modified' => date("Y-m-d H:i:s"),
            'user' => 'system'
            );
    file_put_contents("scrap/anime-$id.txt", json_encode($info));

文本文件的内容是:

"mal_id":18679,"image":"http:\/\/localhost\/images\/anime\/5\/54379.jpg","title":"Kill la Kill","alt_title_eng":" KILL la KILL","alt_title_syn":" KLK","type":" TV","status":" Currently Airing","episodes":25,"genres":"Action, Comedy, School","rank":421,"synopsis":"The story is set on a high school that the student council president Satsuki Kiryuuin rules by force....","user":"system"

解码 JSON 并插入数据库

我正在尝试对内容进行 json_decode 并将值插入 mysql。我没有成功的代码是这样的:

$id= '18679';
$TABLE_PREFIX = 'exp_';
$dbh = new PDO('mysql:host='.$dbhost.';dbname='.$database.';charset=utf8', $dbuser, $dbpass);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);


$JSON = json_decode(file_get_contents("scrap/anime-$id.txt"));  
$stmt = $dbh->prepare("INSERT INTO $TABLE_PREFIXanimedb
(mal_id, image, title, alt_title_eng, alt_title_syn, type, status, episodes, genres, rank, synopsis, modified, user)
    values(:mal_id, :image, :title, :alt_title_eng, :alt_title_syn, :type, :status, :episodes, :genres, :rank, :synopsis, :modified, :user)
    on duplicate key update title= :title, image= :image, alt_title_eng= :alt_title_eng, alt_title_syn= :alt_title_syn, status= :status, episodes= :episodes, genres= :genres, rank= :rank, synopsis= :synopsis, modified= :modified, user= :user");

$user = 'system';
$modified = 'NOW()';
$stmt->bindParam(':mal_id', $id);  
$stmt->bindParam(':image', $JSON->image, PDO::PARAM_STR);
$stmt->bindParam(':title', $JSON->title, PDO::PARAM_STR);      
$stmt->bindParam(':alt_title_eng', $JSON->alt_title_eng, PDO::PARAM_STR);     
$stmt->bindParam(':alt_title_syn', $JSON->alt_title_syn, PDO::PARAM_STR);     
$stmt->bindParam(':type', $JSON->type, PDO::PARAM_STR);     
$stmt->bindParam(':status', $JSON->status, PDO::PARAM_STR);     
$stmt->bindParam(':episodes', $JSON->episodes);     
$stmt->bindParam(':genres', $JSON->genres, PDO::PARAM_STR);     
$stmt->bindParam(':rank', $JSON->rank);     
$stmt->bindParam(':synopsis', $JSON->synopsis, PDO::PARAM_STR);     
$stmt->bindParam(':modified', $modified, PDO::PARAM_STR);     
$stmt->bindParam(':user', $user, PDO::PARAM_STR);     
$stmt->execute() ;

问题:

使用 try/catch,我只得到这个错误:

SQLSTATE[HY093]: Invalid parameter number

我已搜索此错误消息的解决方案,但找不到适合我的问题的解决方案。

【问题讨论】:

我认为你需要指定参数user 两次,因为你不能使用绑定的参数两次 只是一个可能:当你想将一个变量包含在一个字符串中时,你需要连接。 $JSON = json_decode(file_get_contents("scrap/anime-".$id.".txt")); 对不起,@DarkBee 我不太明白。我对这些东西完全陌生。 @a7omiton,它仍然能够返回值。我已经测试过了。 @Imtiaz :看看你的SQL,你有两次:用户,我不认为这是有效的。将其更改为 :user1, :user2 并在参数数组中指定它们:$stmt->bindParam(':user1', $user, PDO::PARAM_STR);$stmt->bindParam(':user2', $user, PDO::PARAM_STR); 【参考方案1】:

您的 SQL 查询是否已经过测试?否则,请尝试

... on duplicate key update title= values(title), ...

而不是

... on duplicate key update title= :title, ...

【讨论】:

谢谢,问题解决了。但这是为什么呢?我见过一些使用命名占位符而不是 values(names) 的示例。 因为您无缘无故地将 PDO::ATTR_EMULATE_PREPARES 设置为 false。还要检查你修改过的字段

以上是关于使用 PDO 将 JSON 解码数据插入 mysql的主要内容,如果未能解决你的问题,请参考以下文章

PDO json插入多个标签

如何使用 PHP PDO 在 mySQL 中插入多行 JSON 对象数据?

pdo 并插入 json 编码到 json 字段

无法使用 php 的 PDO 将数据插入数据库

解码 Json 数据数组并插入到 mysql

使用 PDO 和 PHP 将表单中的数据插入 MySQL 数据库