8

私は PDO に変換しており、プリペアド ステートメントを使用しています。結果をそのままバインドしたいので、$stmt->bind_result($email_count);これを if ステートメントに入れて、電子メールが存在するかどうかを確認できますがFatal error: Call to undefined method PDOStatement::bind_result() in /Applications/XAMPP/xamppfiles/htdocs/imanage/insert.php on line 51、前に関連するエラーが発生しています例。

bind_result は PDO で定義されたメソッドではないと推測しているので、使用できる同等のものはありますか?

それが役立つ場合に備えて、私のコードは以下のとおりです。

insert.php

<?php

 include("connect/class.Database.php");

 class Users extends Database {

     public function insert() {

            $stmt = $this->pdo->prepare("SELECT COUNT(*) FROM users WHERE email=:email");
            $stmt->bindParam(":email", $_POST['email']);
            $stmt->bind_result($email_count);
            $stmt->execute();
            $stmt->fetch(PDO::FETCH_ASSOC);

                    if ($email_count > 0) {
                        echo "email exisits! click here to try <a href='register'>again</a>";
                        } else {
                            //escape the POST data for added protection
                            $username = isset($_POST['username']) ? $_POST['username'] : null;
                            $cryptedPassword = crypt($_POST['password']);
                            $password = $cryptedPassword;
                            $name = isset($_POST['name']) ? $_POST['name'] : null;
                            $email = isset($_POST['email']) ? $_POST['email'] : null;

                            $data = array($username, $password, $name, $email); 
                            $stmta = $this->pdo->prepare("INSERT INTO users (username, password, name, email) VALUES (?, ?, ?, ?)");
                            $stmta->execute($data);

                                printf("%d Row inserted.\n", $stmta->row_count);
                                /* close statement and connection */
                                $stmta->close();
                } // end email_count and insert to table
            } // end function

      }
?>

connect/class.Database.php

<?php

// Database connection PDO

class Database {

    public function __construct() {
        // Connection information
        $host   = 'localhost';
        $dbname = 'imanage';
        $user   = 'root';
        $pass   = '';

        // Attempt DB connection
        try
        {
            $this->pdo = new PDO("mysql:host=$host;dbname=$dbname", $user, $pass);
            $this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            echo 'Successfully connected to the database!';
        }
        catch(PDOException $e)
        {
            echo $e->getMessage();
        }

    }

     public function __destruct()
    {
        // Disconnect from DB
        $this->pdo = null;
        echo 'Successfully disconnected from the database!';
    }


}

?>
4

4 に答える 4

4

SELECT COUNT()クエリなどから値をすばやく取得するには、 を参照してくださいPDOStatement::fetchColumn

$stmt = $pdo->prepare('SELECT COUNT(1) FROM users WHERE email = :email');
$stmt->bindParam(':email', $email);
$stmt->execute();
$email_count = $stmt->fetchColumn();

また、その他のアドバイスもいただきたいです。PDOクラス コンストラクターで接続を作成するべきではありません。これは、 を拡張するクラスをインスタンス化するたびにDatabase、新しい接続を作成することを意味します。代わりに、PDOインスタンスを依存関係として渡します。

abstract class Database {
    /**
     * @var PDO
     */
    protected $pdo;

    public function __construct(PDO $pdo) {
        $this->pdo = $pdo;
    }
}

同じことがあなたのUser::insert方法にも当てはまります。メソッド引数を介して必要なパラメーターを渡すようにしてください。クラスの単体テストの作成を開始したい場合、これは非常に貴重です。

public function insert($email) {
    $stmt = $this->pdo->prepare('SELECT COUNT(1) FROM users WHERE email = :email');
    $stmt->bindParam(':email', $email);
    $stmt->execute();
    $email_count = $stmt->fetchColumn();

    // and so on

最後に、PHP のみのファイルの場合は、PHP の終了タグを省略します?>。これにより、ブラウザに送信される可能性のあるファイルの末尾に空白を誤って含めることがなくなります。

于 2013-09-10T00:36:38.750 に答える
2

文字通りの答えを求めてここに来る人々のために。

使用するbindColumn

PDOStatement::bindColumn — 列を PHP 変数にバインドする

同じソースからの例を使用:

function readData($dbh) {
  $sql = 'SELECT name, colour, calories FROM fruit';
  try {
    $stmt = $dbh->prepare($sql);
    $stmt->execute();

    /* Bind by column number */
    $stmt->bindColumn(1, $name);
    $stmt->bindColumn(2, $colour);

    /* Bind by column name */
    $stmt->bindColumn('calories', $cals);

    while ($row = $stmt->fetch(PDO::FETCH_BOUND)) {
      $data = $name . "\t" . $colour . "\t" . $cals . "\n";
      print $data;
    }
  }
  catch (PDOException $e) {
    print $e->getMessage();
  }
}
readData($dbh);
于 2018-01-15T10:09:03.043 に答える
0

これが私のカスタム関数です:

function bindColumns($stmt, $columns){
    if(!is_array($columns)) $columns=array($columns);
    $count=count($columns);
    for($i=0;$i<$count;$i++) $stmt->bindColumn($i+1, $columns[$i]);
}

および使用法 (参照による変数):

bindColumns($stmt, array(&$worker_id, &$password, &$salt));
于 2015-08-17T05:06:57.743 に答える