1

次のように定義された mySQL テーブルがあります。

CREATE TABLE IF NOT EXISTS `coupons` (
    `coupon_id` int(11) NOT NULL auto_increment,
    `coupon_code` varchar(50) NOT NULL,
    `coupon_expiration_date` date NOT NULL,
    `coupon_discount` decimal(10,2) NOT NULL,
    `coupon_created_date` date NOT NULL,
    PRIMARY KEY  (`coupon_id`)
)

このテーブルの 1 つのエントリは次のとおりです。

INSERT INTO `coupons` (`coupon_id`, `coupon_code`, `coupon_expiration_date`, `coupon_discount`, `coupon_created_date`) VALUES (1, 'test', '2012-11-30', '11.00', '2012-10-22');

次の PHP コードを使用してこのテーブルにクエリを実行しようとすると、次のようになります。

$strSelectCoupons = "SELECT coupon_id FROM coupons";
if($stmtSelectCoupons = $mysqlConn->prepare($strSelectCoupons))
{
    $stmtSelectCoupons->execute();
    $stmtSelectCoupons->bind_result($iCouponId);

    while($stmtSelectCoupons->fetch())
    {
        echo $iCouponId;
    }
}
else
{
    echo "Prepared statement error: " . $mysqlConn->error;
}

予想どおり、「1」が画面に表示されます。

ただし、次の PHP コードを実行しようとすると:

$strSelectCoupons = "SELECT coupon_id, coupon_code FROM coupons";
if($stmtSelectCoupons = $mysqlConn->prepare($strSelectCoupons))
{
    $stmtSelectCoupons->execute();
    $stmtSelectCoupons->bind_result($iCouponId, $strCouponCode);

    while($stmtSelectCoupons->fetch())
    {
        echo $iCouponId . "<br />";
        echo $strCouponCode . "<br />";
    }
}
else
{
    echo "Prepared statement error: " . $mysqlConn->error;
}

結果は表示されず、エラーは出力されず、エラーはログに記録されず、ページの残りの部分はレンダリングされません。

実際、これが実際に期待どおりに機能するのは、coupon_id のみを返す場合だけです。たとえば、select ステートメントを変更して Coupon_code のみを返すようにすると、これもページが爆破されます。

これが失敗する原因についてのアイデアはありますか?

アパッチのバージョン: 2.2.2

PHP バージョン: 5.3.14

MySQL バージョン: 5.0.95-コミュニティ

編集:

さらに調査したところ、bind_result は INT 型の列でのみ機能し、別の型の列をバインドしようとすると失敗します。

4

2 に答える 2

0

非常に古いトピックですが、「解決策」、奇妙なものを見つけました。bind_result を IF に入れます

if(!$stmtSelectCoupons->bind_result($iCouponId, $strCouponCode)) { // TODO error }
于 2013-08-20T12:36:10.077 に答える
0

へのコメントは、大きなデータ列でクラッシュを引き起こすMySQL クライアント ライブラリのバグmysqli_stmt_bind_result()を指摘しています。

報告によると、mysqlnd と MySQL の Connector/C ではこの問題が発生しないか、可能であれば を呼び出すmysqli_stmt_store_result()前に を呼び出すことができますmysqli_stmt_bind_result()

于 2012-10-22T18:50:12.877 に答える