使用 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的主要内容,如果未能解决你的问题,请参考以下文章