0

大家好,我一直在玩 PDO,并且正在慢慢地将一些旧代码转换为这个。

有点卡在一些事情上,努力寻找我需要的东西。

我遇到的问题是:

  1. $db一个函数或排序,所以它只有在我调用它时才打开,我只想管理这个的一个实例
  2. 检查执行是否成功,如果没有返回值等。

此外,关于以下代码的任何建议都会非常完整,因为我是从网络上收集的。

当前代码:

//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";
}

似乎到了那里,上面的作品看起来如何

4

2 回答 2

1

将 $db 放在函数或排序中,因此它仅在我调用它时才打开,我只想管理它的一个实例。

在脚本的开头打开它,然后将其传递给需要它的函数。在函数内部打开一个新的数据库连接可能会导致进一步的问题。例如,如果您的函数在同一个脚本中多次使用怎么办?您真的不想每次调用同一个函数时都打开一个新的数据库连接。

检查执行是否成功,如果没有返回值等。

至于检查 PDOStatement::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();
}
于 2013-02-08T13:26:07.790 回答
1

检查执行是否成功,如果没有返回值等。

我个人更喜欢异常,并且 PDO 可以配置为在错误时引发异常。异常很好,因为失败语句之后的代码没有被执行。如果您有父行,然后编写一些依赖于插入父行的子行,这会很方便。当无法创建父行时,您不想编写子行。

可以通过这样做来打开它:

<?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 */
}
于 2013-02-08T13:43:24.683 回答