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`)
)

此表中的一项如下:

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-community

编辑:

在进一步调查中,bind_result 仅适用于 INT 类型的列,并在尝试绑定其他类型的任何列时失败。

4

2 回答 2

0

评论mysqli_stmt_bind_result()指出MySQL 客户端库中的一个错误,该错误导致大数据列崩溃。

据报道,mysqlnd 和 MySQL 的 Connector/C 没有出现这个问题,或者如果可能的话,您可以mysqli_stmt_store_result()在调用mysqli_stmt_bind_result().

于 2012-10-22T18:50:12.877 回答
0

很老的话题,但我找到了一个“解决方案”,一个奇怪的,把你的 bind_result 放在 IF

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