2017-08-05 17 views
1

以下のコードは期待通りに動作します。テーブル 'keywords'に3つのエントリを追加します。私は(私は最初の部分をコメント解除)以下のコードを実行するとphpの不思議な振る舞い

<?php 
include "config.php"; 
try{ 
    // $conn = new PDO(DBINFO,USER,PASS); 
    // $sql = "INSERT INTO projects (title,duration, startyear, description, tags,email) VALUES (:title,:duration, :startyear, :description, :tags,:email)"; 
    // $stmt = $conn->prepare($sql); 
    // $stmt->bindParam(':title', $_POST['title'],PDO::PARAM_STR); 
    // $stmt->bindParam(':email', $_POST['email'], PDO::PARAM_STR); 
    // $stmt->bindParam(':duration', $_POST['duration'], PDO::PARAM_STR); 
    // $stmt->bindParam(':startyear', $_POST['startyear'], PDO::PARAM_STR); 
    // $stmt->bindParam(':description', $_POST['description'], PDO::PARAM_STR); 
    // $stmt->bindParam(':tags', $_POST['tags'], PDO::PARAM_STR); 
    // $stmt->execute(); 

    for($i=0; $i<3; $i++){ 
     $conn2 = new PDO(DBINFO,USER,PASS); 
     $sql2 = "INSERT INTO keywords (keyword,confidence) VALUES (:keyword,:confidence)"; 
     $stmt2 = $conn2->prepare($sql2); 
     $a = 'asdfds'; 
     $stmt2->bindParam(':keyword', $a,PDO::PARAM_STR); 
     $stmt2->bindParam(':confidence', $a, PDO::PARAM_STR); 
     $stmt2->execute(); 
    } 
} 
catch(PDOException $pe){ 
    die("Could not connect to the database :".$pe->getMessage()); 
} 
?> 

ただし、登録は、「キーワード」テーブルに6回追加されます。

<?php 
include "config.php"; 
try{ 
    $conn = new PDO(DBINFO,USER,PASS); 
    $sql = "INSERT INTO projects (title,duration, startyear, description, tags,email) VALUES (:title,:duration, :startyear, :description, :tags,:email)"; 
    $stmt = $conn->prepare($sql); 
    $stmt->bindParam(':title', $_POST['title'],PDO::PARAM_STR); 
    $stmt->bindParam(':email', $_POST['email'], PDO::PARAM_STR); 
    $stmt->bindParam(':duration', $_POST['duration'], PDO::PARAM_STR); 
    $stmt->bindParam(':startyear', $_POST['startyear'], PDO::PARAM_STR); 
    $stmt->bindParam(':description', $_POST['description'], PDO::PARAM_STR); 
    $stmt->bindParam(':tags', $_POST['tags'], PDO::PARAM_STR); 
    $stmt->execute(); 

    for($i=0; $i<3; $i++){ 
     $conn2 = new PDO(DBINFO,USER,PASS); 
     $sql2 = "INSERT INTO keywords (keyword,confidence) VALUES (:keyword,:confidence)"; 
     $stmt2 = $conn2->prepare($sql2); 
     $a = 'asdfds'; 
     $stmt2->bindParam(':keyword', $a,PDO::PARAM_STR); 
     $stmt2->bindParam(':confidence', $a, PDO::PARAM_STR); 
     $stmt2->execute(); 
    } 
} 
catch(PDOException $pe){ 
    die("Could not connect to the database :".$pe->getMessage()); 
} 
?> 

私はこれを理解できません。どんな助け?

+0

bindParamの代わりにbindValueを使用してテストし、3番目の/ typeパラメータをそのまま/離してください。 –

答えて

2

最初に同じサーバーとスキーマに対して4つの異なる接続を作成するのはなぜですか?

ループは接続を作成し、ステートメントや接続への参照が上書きされると自動的に閉じます。

しかし、ループの前の元の接続は開いたままであり、ステートメントに対して再利用されます。ループの前に3番目の接続を閉じずに作成すると、9つのエントリがあります。

接続オブジェクトへの参照が不要になったら削除します(これには関連する文も含まれます)。

また、すべてのステートメントに対して新しい接続を作成するのではなく、接続を再利用する方が効果的です。

関連する問題