大家好,我一直在玩PDO,并且正在慢慢地将一些旧代码转换为PDO。
有点被一些事情卡住了,很难找到我需要的东西。
我陷入困境的是:
- 在函数或排序中具有
$db
,因此仅当i调用它,我只想管理这个的一个实例 - 检查是否execute成功,如果未成功,则返回值等
此外,任何关于以下代码的建议都将是非常完整的,因为我已经从网上收集了这些信息。
当前代码:
//Database Array
$config['db'] = array(
'host' => 'localhost',
'username' => 'root',
'password' => 'root',
'dbname' => 'root');
//New PDO
$db = new PDO('mysql:host=' . $config['db']['host'] . ';dbname=' . $config['db']['dbname'], $config['db']['username'], $config['db']['password']);
//Check connection is ok
try {
$db->exec("SET CHARACTER SET utf8");
}
catch (PDOException $ex) {
print "Error!: " . $ex->getMessage() . "<br/>";
die();
}
//Update users function
function update($db, $fn, $ln, $email, $offers, $vlue, $responce) {
$stmt = $db->prepare("insert into kkt (fName_765, lName_765, email_765, signup_765, stamp_765) values (:fname, :lname, :email, :signup, NOW())");
$stmt->bindParam(':fname', $fn, PDO::PARAM_STR);
$stmt->bindParam(':lname', $ln, PDO::PARAM_STR);
$stmt->bindParam(':email', $email, PDO::PARAM_STR);
$stmt->bindParam(':signup', $offers, PDO::PARAM_STR);
$stmt->execute();
print $db->lastInsertId();
$stmt = null;
}
//Test Attributes
$fn = 'test';
$ln = 'test';
$email = 'tesst@test,com';
$offers = '1';
update($db, $fn, $ln, $email, $offers, $vlue, $responce);
提前感谢的任何帮助/提示
编辑代码:
//Database Array
$config['db'] = array(
'host' => 'localhost',
'username' => 'root',
'password' => 'root',
'dbname' => 'local');
//New PDO
$db = new PDO('mysql:host=' . $config['db']['host'] . ';dbname=' . $config['db']['dbname'], $config['db']['username'], $config['db']['password']);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
//Check connection is ok
try {
$db->exec("SET CHARACTER SET utf8");
}
catch (PDOException $ex) {
print "Error!: " . $ex->getMessage() . "<br/>";
die();
}
//Update users function
function update($db, $fn, $ln, $email, $offers, $vlue, $responce)
{
$stmt = $db->prepare("insert into local (fName_765, lName_765, email_765, signup_765) values (:fname, :lname, :email, :signup, NOW())");
$stmt->bindParam(':fname', $fn, PDO::PARAM_STR);
$stmt->bindParam(':lname', $ln, PDO::PARAM_STR);
$stmt->bindParam(':email', $email, PDO::PARAM_STR);
$stmt->bindParam(':signup', $offers, PDO::PARAM_STR);
try {
$stmt->execute();
print $db->lastInsertId(); //show ID
return true;
}
catch (PDOException $e) {
print "Error!: " . $e->getMessage() . "<br/>"; // show error
return false;
}
}
//Test Attributes
$fn = 'test';
$ln = 'test';
$email = 'tesst@test,com';
$offers = '1';
if (!update($db, $fn, $ln, $email, $offers, $vlue, $responce)) {
echo "no update there is a slight problem";
} else {
echo "it seemed to work";
}
看起来已经达到了目标,上面的工作原理显示它看起来像
检查执行是否成功,如果没有返回值等
就我个人而言,我更喜欢Exceptions,并且PDO可以配置为在出现错误时引发Exceptions。异常很好,因为失败语句之后的代码没有执行。如果您有一个父行,然后编写一些依赖于插入的父行的子行,这就很方便了。当无法创建父行时,您不希望写入子行。
可以通过以下操作打开:
<?php
$pdo = new PDO(/* DSN */);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ATTR_ERRMODE_EXCEPTION);
然后你会做:
<?php
try {
$stmt->execute();
return true;
} catch ('PDOException $e) {
return false;
}
您可以在此处找到更多信息:http://www.php.net/manual/en/pdo.error-handling.php
在函数或排序中有$db,所以它只在我调用它时打开,我只想管理这个的一个实例
我通常使用服务容器来管理数据库连接。现有最简单的选项是Pimple。然后传递这个服务容器,服务容器只负责创建一个数据库连接。
<?php
$config = new 'Pimple;
$config['db.options'] = array(
'host' => 'localhost',
'username' => 'root',
'password' => 'root',
'dbname' => 'root');
# Calling the "share" method makes sure that the function is only called when
# 'db' is retrieved the first time.
$config['db'] = $config->share(function() use ($config) {
return new PDO('mysql:host=' . $config['db.options']['host'] . ';dbname=' . $config['db.options'']['dbname'], $config['db.options'']['username'], $config['db.options'']['password']);
});
function update() {
global $config;
# Connection is only made the first time the 'db' key is accessed.
$db = $config['db'];
/* Do queries */
}
在函数或排序中具有$db,因此它只有在我调用时才打开它,我只想管理其中的一个实例。
在脚本开始时打开它,然后将其传递给需要它的函数。在函数内部打开新的数据库连接可能会导致后续问题。例如,如果在同一个脚本中多次使用您的函数,该怎么办?您并不希望每次调用相同的函数时都打开一个新的数据库连接。
检查执行是否成功,如果没有返回值等
至于检查PDOState::execute是否成功:
$result = $stmt->execute();
如果您查看手册,返回类型列为:
成功时返回TRUE,失败时返回FALSE。
$result = $stmt->execute();
return $result;
或
return $stmt->execute();
就我个人而言,我会选择:
function update($db, $fn, $ln, $email, $offers, $vlue, $responce) {
$stmt = $db->prepare("insert into kkt (fName_765, lName_765, email_765, signup_765, stamp_765) values (:fname, :lname, :email, :signup, NOW())");
$stmt->bindParam(':fname', $fn, PDO::PARAM_STR);
$stmt->bindParam(':lname', $ln, PDO::PARAM_STR);
$stmt->bindParam(':email', $email, PDO::PARAM_STR);
$stmt->bindParam(':signup', $offers, PDO::PARAM_STR);
return $stmt->execute();
}
顺便说一句,当你把一个对象传递到一个函数中时,它会自动通过引用传递,这意味着你可以做一些类似的事情:
$result = update($db, $fn, $ln, $email, $offers, $vlue, $responce);
if($result){
echo $db->lastInsertId();
}