【发布时间】:2020-01-01 00:42:44
【问题描述】:
这只是我不完全理解的一种新形式的 PDO。我知道与此类似的问题已在此站点上解决。但是我被这个新的(对我来说是新的)基于类的 PDO 系统所吸引。它时尚简洁。我想通了,所有动态用户数据都插入到数据库中就好了。但是,我不知道如何使用这种特殊样式包含 lastInsertId()。用户没有输入帖子 ID,我无法使用 GET 请求,这是我通常获取帖子 ID 的方式。
经过多次失败的尝试,我在下面的内容是我能做的最好的。显然它不起作用。对我的代码的任何更正将不胜感激。
这是数据库类:
functions.php
class DB{
private static function connect(){
$pdo = new PDO('mysql:host=localhost;dbname=poetionpics;charset=utf8', 'root', '');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
return $pdo;
}
public static function query($query, $params = array()){
$stmt = self::connect()->prepare($query);
$stmt->execute($params);
if(explode(' ', $query)[0] == 'SELECT'){
$data = $stmt->fetchALL();
return $data;
}
}
public function lastInsertId(){
$pdo = new PDO('mysql:host=localhost;dbname=poetionpics;charset=utf8', 'root', '');
$pdo->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
return $pdo->lastInsertId();
}
}
这是我的插入代码:
action.php
for($count = 0; $count < count($_POST['hidden_post_title']); $count++){
$post_title = (isset($_POST['hidden_post_title'][$count])) ? strip_tags($_POST['hidden_post_title'][$count]) : NULL;
$post_desc = (isset($_POST['hidden_post_desc'][$count])) ? strip_tags($_POST['hidden_post_desc'][$count]) : NULL;
$newvidurl = (isset($_POST['hidden_vid_url'][$count])) ? strip_tags($_POST['hidden_vid_url'][$count]) : NULL;
$url_1 = (isset($_POST['url1_hidden_id'][$count])) ? strip_tags($_POST['url1_hidden_id'][$count]) : NULL;
$url_2 = (isset($_POST['url2_hidden_id'][$count])) ? strip_tags($_POST['url2_hidden_id'][$count]) : NULL;
DB::query('INSERT INTO cloudbook_posts VALUES (\'\', :post_title, :post_desc)',
array(':post_title'=>$post_title, ':post_desc'=>$post_desc));
//This is possibly problematic code or wrong location....
$postid = DB::lastInsertId('SELECT id FROM cloudbook_posts WHERE id=:id',
array(':id'=>$_POST['id']))[0]['id'];
//End problematic code
DB::query('INSERT INTO vid_info VALUES (\'\', :newvidurl, :postid)',
array(':newvidurl'=>$newvidurl, ':postid'=>$postid));
DB::query('INSERT INTO url_1 VALUES (\'\', :url_1, :postid)',
array(':url_1'=>$url_1, ':postid'=>$post_id));
}
echo str_replace(array('hidden_post_title', 'hidden_post_desc', 'url1_hidden_id', 'url2_hidden_id', '{', '}', '"', ',', ':'), '',
htmlspecialchars(json_encode($result), ENT_NOQUOTES));
?>
我在数据库中得到的是这样的:
vid_info table
id | newvidurl | postid
69 | some user data | 0
我想要的是:
vid_info table
id | newvidurl | postid
69 | some user data | $postid (see action.php for variable value)
【问题讨论】:
-
[0]['id']的目的是什么? -
您使用
lastInsertId,但您没有插入,您正在尝试选择。 -
你似乎想多了。没有理由在 sql 查询中选择最后一个插入 id - php 为您完成这些工作。你几乎只需要使用
$postid = $db->lastInsertId();或者你一直在使用它$postid = PDO::lastInsertId() -
总的来说这是一份不错的工作,但请考虑阅读我在sleek & concise PDO systems' common mistakes 上的文章。并且 lastInsertId() 方法名称绝对不恰当且具有误导性。至少称它为 insert()
-
达曼,[0]['id]的目的是从'cloudbook_posts'表中的MySql数据库中选择id字段。我没有显示 cloudbook_posts 表 b/c 这个问题没有必要,但是按照顺序,posts 表是 id | post_title | post_desc.....
标签: php database class pdo last-insert-id