2

PHPとMySQLを使用して、MySQLストアドプロシージャを利用してMySQLデータベースに対してプリペアドステートメントクエリを実行するCMSを開発することを計画しています。PHPで開発してから(手続きの時代に)長い時間が経ちましたので、PHPの新しいOOP構造を使用してこのシステムを実装してみます。その前に、MySQLストアドプロシージャの出力パラメータを単純なphpページに戻すという単純な問題を理解する必要があります。これは単なるテストであり、最初のphpクラスを開発する前に構文を正しく取得できるため、ここに投稿された最初のコードは手続き型です。

まず、ストアドプロシージャがあります。

    DELIMITER $$
    DROP PROCEDURE IF EXISTS `text_development`.`get_user`$$
    CREATE PROCEDURE  `text_development`.`get_user`
    (
    IN userId INT,
    OUT user_name VARCHAR(100)
    )
    BEGIN
    SELECT username
    INTO user_name
    FROM user
    WHERE user_id = userId;
    END $$
    DELIMITER ;

次に、2つのphpファイルがあります。

    <?php
    //db_config.php
    $mysqli_host = "localhost";
    $mysqli_user = "root"; //I'm not stupid enough to use this in development
    $mysqli_pass = "root"; //before anyone comments about the root usage
    $mysqli_db = "text_development";
    ?>


    <?php
    //index.php
    require('incl/db_config.php');
    $dbConnection = new Mysqli($mysqli_host, $mysqli_user, $mysqli_pass, $mysqli_db) or die(mysql_error());
    print '<h1>Stored Procedure Retrieval Test</h1>';
    $id = 1;
    $return = '';
    $result = $dbConnection->query( 'CALL get_user($id,$return)');
    print $result;
    ?>

私の問題はindex.phpページで発生します。実際には何も返さないようです。PHPMyAdminでストアドプロシージャを実行すると、ユーザーID 1を渡すとユーザー名テストが返されますが、phpで関数を呼び出すと画面に何も返されません。$ returnも出力しようとしましたが、これは空の文字列を返します(上記のコードで定義したとおり)。このオンラインチュートリアルを使用してみましたが、そこでの解決策は機能していないようです:

http://www.joeyrivera.com/2009/using-mysql-stored-procedures-with-php-mysqlmysqlipdo/

ここで私が間違っていることと、このストアドプロシージャの戻りパラメータが画面に出力されない理由を誰かが知っていますか?

4

1 に答える 1

1

まず、PDOのチュートリアルを参照しますが、Mysqliを使用します。

2番目:変換:

$result = $dbConnection->query( 'CALL get_user($id,$return)');

to(二重引用符と@ return`に注意してください):

$result = $dbConnection->query( "CALL get_user({$id},@return)");

その後、次のことを行います。

$result = $dbConnection->query( 'SELECT @return');

SPがSELECTの場合は、作成したとおりに実行します。

理由は、SPがPHPに何も返さず、値をMySQL変数(@return)(scopはMySQLにある)に返すため、別の呼び出しでこの変数を照会する必要があるためです。単純なselectSPの呼び出しである場合、他のselectステートメントと同じように値を返します。

于 2013-01-27T21:44:50.103 に答える