0

こんにちは、私はPDOで遊んでいて、古いコードをゆっくりとこれに変換しています。

いくつかのことに少し行き詰まり、必要なものを見つけるのに苦労しています。

私が立ち往生しているのは:

  1. $dbin関数またはソートを持っているので、それを呼び出したときにのみ開くので、これの1つのインスタンスのみを管理したい
  2. 実行が成功したかどうかを確認し、成功しなかった場合は値などを返します。

また、以下のコードに関するアドバイスは、私がWeb上のソースからこれを収集したので、非常に充実しています。

現在のコード:

//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を関数またはソートに含めると、$ dbを呼び出したときにのみ開かれるようになり、このインスタンスを1つだけ管理したいと思います。

スクリプトの開始時にそれを開き、それを必要とする関数に渡します。関数内で新しいデータベース接続を開くと、さらに問題が発生する可能性があります。たとえば、同じスクリプト全体で関数が複数回使用された場合はどうなりますか?同じ関数が呼び出されるたびに新しいデータベース接続を開く必要はありません。

実行が成功したかどうかを確認し、成功しなかった場合は値などを返します。

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を関数またはソートに含めると、呼び出したときにのみ開かれるようになり、このインスタンスを1つだけ管理したいと思います。

私は通常、サービスコンテナを使用してデータベース接続を管理しています。最も単純な既存のオプションはPimpleです。次に、このサービスコンテナを渡すと、サービスコンテナは1つのデータベース接続の作成のみを担当します。

<?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 に答える