Php PDO连接/准备并在自己的功能中执行最佳实践
大家好,我一直在玩PDO的,我慢慢地转换一些旧代码到这个 有些事情让我有点纠结,努力寻找我需要的东西 我遇到的问题是:Php PDO连接/准备并在自己的功能中执行最佳实践,php,Php,大家好,我一直在玩PDO的,我慢慢地转换一些旧代码到这个 有些事情让我有点纠结,努力寻找我需要的东西 我遇到的问题是: //Database Array $config['db'] = array( 'host' => 'localhost', 'username' => 'root', 'password' => 'root', 'dbname' => 'local'); //New PDO $db = new PDO('mysql:h
//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";
}
$db
,因此只有当我
调用它,我只想管理一个实例//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);
//数据库数组
$config['db']=数组(
'主机'=>'本地主机',
'用户名'=>'根',
'密码'=>'根',
“dbname”=>“root”);
//新PDO
$db=new PDO('mysql:host='.$config['db']['host'].;dbname='.$config['db']['dbname'],$config['db']['username'],$config['db']['password']);
//检查连接是否正常
试一试{
$db->exec(“设置字符集utf8”);
}
捕获(PDO异常$ex){
打印“错误!:”$ex->getMessage()。“
”;
模具();
}
//更新用户功能
功能更新($db、$fn、$ln、$email、$offers、$vlue、$response){
$stmt=$db->prepare(“插入kkt(fName_765,lName_765,email_765,signup_765,stamp_765)值(: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();
打印$db->lastInsertId();
$stmt=null;
}
//测试属性
$fn=‘测试’;
$ln=‘测试’;
$email='1tesst@test,com';
$offers='1';
更新($db、$fn、$ln、$email、$offers、$vlue、$response);
提前感谢您的帮助/提示
编辑的代码:
//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";
}
//数据库数组
$config['db']=数组(
'主机'=>'本地主机',
'用户名'=>'根',
'密码'=>'根',
“dbname”=>“local”);
//新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_异常);
//检查连接是否正常
试一试{
$db->exec(“设置字符集utf8”);
}
捕获(PDO异常$ex){
打印“错误!:”$ex->getMessage()。“
”;
模具();
}
//更新用户功能
功能更新($db、$fn、$ln、$email、$offers、$vlue、$response)
{
$stmt=$db->prepare(“插入到本地(fName_765,lName_765,email_765,signup_765)值(: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();
打印$db->lastInsertId();//显示ID
返回true;
}
捕获(PDO$e){
打印“错误!”:“$e->getMessage()。”
“;//显示错误
返回false;
}
}
//测试属性
$fn=‘测试’;
$ln=‘测试’;
$email='1tesst@test,com';
$offers='1';
如果(!更新($db、$fn、$ln、$email、$offers、$vlue、$response)){
echo“无更新,存在轻微问题”;
}否则{
回声“它似乎起了作用”;
}
似乎正在到达那里,上面的工作看起来怎么样
在函数或排序中有$db,因此只有在调用
它,我只想管理一个实例
在脚本开始时打开它,然后将其传递到需要它的函数中。在函数内部打开新的数据库连接可能会导致问题进一步恶化。例如,如果您的函数在同一个脚本中被多次使用,该怎么办?您并不希望每次调用同一个函数时都打开一个新的数据库连接
检查执行是否成功,如果未返回值等
至于检查PDOStatement::execute是否成功:
$result = $stmt->execute();
如果查看,返回类型如下所示:
成功时返回TRUE,失败时返回FALSE
或
我个人认为:
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();
}
检查执行是否成功,如果未返回值等
就个人而言,我更喜欢异常,PDO可以配置为在出现错误时引发异常。异常很好,因为失败语句后面的代码没有执行。如果您有一个父行,然后编写一些依赖于插入的父行的子行,那么这很方便。无法创建父行时,您不希望写入子行
可以通过执行以下操作来启用此功能:
<?php
$pdo = new PDO(/* DSN */);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ATTR_ERRMODE_EXCEPTION);
感谢您提供的信息,因此请将$db放在原处(很抱歉,可能没有阅读您的答案),其他的都很好,谢谢。
<?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;
}
<?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 */
}