0

グローバル変数を使用し、bindValue()を使用してプレースホルダーに割り当て、値をデータベースに挿入できるようにします。私が使用している関数は以下のとおりです

public function insertComment() {
    $conn = new PDO( DB_DSN, DB_USERNAME, DB_PASSWORD );
    $sql = 'INSERT INTO comments ( name, email, commentText, articleID ) VALUES ( :name, :email, :commentText, :articleID )';
    $st = $conn->prepare ( $sql );
    $st->bindValue( ":name", $this->name, PDO::PARAM_STR );
    $st->bindValue( ":email", $this->email, PDO::PARAM_STR );
    $st->bindValue( ":commentText", $this->commentText, PDO::PARAM_STR );
    $st->bindValue( ":articleID", $this->articleID, PDO::PARAM_INT );
    $st->execute();
    $conn = null;
}

パブリック変数を作成できない理由は、データがフォームからフォームに投稿されており、パブリックまたはパブリックスタティックの使用が無効な構文であるためです。私が使用している変数は

$name = isset($_POST['name']) ? $_POST['name'] : '';
$email = isset($_POST['email']) ? $_POST['email'] : '';
$commentText = isset($_POST['comment']) ? $_POST['comment'] : '';
$id = isset($_POST['id']) ? $_POST['id'] : '';

私がやりたいことは可能ですか、それともデータベースに挿入できるように値を割り当てる別の方法を見つけたほうがいいですか?

4

1 に答える 1

2

データベース インスタンスの作成を関数の外側に削除することから始めます。これは、見た目からすると、多くのデータベース接続を開いたり閉じたりしているためです。

class Foo
{
    private $conn;

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

    public function insertComment($name, $email, $comment, $articlId) {
        $sql = 'INSERT INTO comments ( name, email, commentText, articleID ) VALUES ( :name, :email, :commentText, :articleID )';
        $st = $this->conn->prepare ( $sql );
        $st->bindValue( ":name", $name, PDO::PARAM_STR );
        $st->bindValue( ":email", $email, PDO::PARAM_STR );
        $st->bindValue( ":commentText", $commentText, PDO::PARAM_STR );
        $st->bindValue( ":articleID", $articleID, PDO::PARAM_INT );
        $st->execute();
    }
}

$conn = new PDO( DB_DSN, DB_USERNAME, DB_PASSWORD );
$foo = new Foo($conn);
$foo->insertComment($_POST['name'], $_POST['email'], $_POST['commentText'], $_POST['articleId']);

または、リクエストオブジェクトをいくつか用意し、それを使用してメソッドに挿入することをお勧めします。

ただし、変数の意味がわからないglobalのは、リクエスト変数 ( $_GET$_POSTなど) がデフォルトでグローバルであることを意味するスーパーグローバルであるためです。また、どこからでもアクセスできます (ベスト プラクティスではありませんが)。

于 2013-01-06T19:43:05.107 に答える