【问题标题】:code igniter active records query missing apostrophescodeigniter 活动记录查询缺少撇号
【发布时间】:2011-05-25 23:08:01
【问题描述】:

代码点火器正在吐出:

A Database Error Occurred
Error Number: 1064

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'TEST, `cardNumber` = 411111........11, `cardExpiry` = 1212, `authCode` = 110200,' at line 1

UPDATE `pxpayRequest` SET `status` = 'approved', `cardName` = Visa, `cardHolder` = VISA TEST, `cardNumber` = 411111........11, `cardExpiry` = 1212, `authCode` = 110200, `dpsTxnRef` = 0000000800b51dde, `dpsMessage` = APPROVED WHERE `id` = 1

而且,很明显,这是由于缺少 '

为什么 code igniter 没有正确放入这些?

这是我的代码:

$id = $result->MerchantReference;
$cardName = $result->CardName;
$cardHolder = $result->CardHolderName;
$cardNumber = $result->CardNumber;
$cardExpiry = $result->DateExpiry;
$authCode = $result->AuthCode;
$dpsRef = $result->DpsTxnRef;
$dpsMessage = $result->ResponseText;

$this->db->set('status', 'approved')
         ->set('cardName', $cardName)
         ->set('cardHolder', $cardHolder)
         ->set('cardNumber', $cardNumber)
         ->set('cardExpiry', $cardExpiry)
         ->set('authCode', $authCode)
         ->set('dpsTxnRef', $dpsRef)
         ->set('dpsMessage', $dpsMessage)
         ->where('id', $id)
         ->update('pxpayRequest');

您可以通过查看上面的查询来查看关联的值。

这是 $result 的print_r

SimpleXMLElement Object
(
    [@attributes] => Array
        (
            [valid] => 1
        )

    [Success] => 1
    [TxnType] => Purchase
    [CurrencyInput] => NZD
    [MerchantReference] => 1
    [TxnData1] => SimpleXMLElement Object
        (
        )

    [TxnData2] => SimpleXMLElement Object
        (
        )

    [TxnData3] => SimpleXMLElement Object
        (
        )

    [AuthCode] => 121132
    [CardName] => Visa
    [CardHolderName] => VISA CARD
    [CardNumber] => 411111........11
    [DateExpiry] => 1212
    [ClientInfo] => 125.236.220.238
    [TxnId] => 4ddd9aa1dd14c
    [EmailAddress] => SimpleXMLElement Object
        (
        )

    [DpsTxnRef] => 0000000800b5d3c9
    [BillingId] => SimpleXMLElement Object
        (
        )

    [DpsBillingId] => SimpleXMLElement Object
        (
        )

    [AmountSettlement] => 8.00
    [CurrencySettlement] => NZD
    [DateSettlement] => 20110526
    [TxnMac] => BD43E619
    [ResponseText] => APPROVED
    [CardNumber2] => SimpleXMLElement Object
        (
        )

    [IssuerCountryId] => 0
)

【问题讨论】:

  • 应该是逃逸了,你需要在DB驱动的源码中做一个快速调试,看看哪里出了问题。 Set() 在 /system/database/DB_active_rec.php 中(确保它遵循在 $value 上调用 $this->escape() 的正确流路径),它应该从 /system/database 调用 escape() /DB_driver.php 的工作是在值周围添加引号

标签: php mysql sql codeigniter


【解决方案1】:

我刚刚经历了这个——我认为问题的一部分是 simplexml 返回的一些值被认为是对象。不管是什么原因——你必须在插入之前将值转换为字符串。谢天谢地,它真的很简单,只需添加(字符串)

从这里开始

$cardName = $result->CardName;

到这里

$cardName = (string)$result->CardName;

【讨论】:

    【解决方案2】:

    很奇怪:在任何最近的 CodeIgniter 上应该都能正常工作。我唯一能想到的可能是 db 库没有正确识别您的数据库,或者这些变量没有被识别为字符串(因此没有发生转义)。 echo is_string($cardName); 说什么?

    【讨论】:

    • 使用echo 'is: '.(is_string($cardName) ? 'true' : 'false'); 我得到is: false
    • 在做echo $cardName.' is: '.(is_string($cardName) ? 'true' : 'false'); 我得到Visa is: false
    • 啊,是的,这完全会失败。这样做:$cardName = (string)$result->CardName[0];
    • 嗯,愚蠢的简单xml...它需要转换为类型字符串:php.net/manual/en/simplexml.examples-basic.php#example-4587
    【解决方案3】:

    尝试将第三个参数设置为 TRUE。

    $this->db->set('cardHolder', $cardHolder, TRUE);
    

    【讨论】:

      【解决方案4】:

      我刚刚阅读了一个简单的解决方案...

      我更改了 var $_escape_char 的值 (system/database/drivers/mysql/mysql_driver.php, line 36..

      原来是

      var $_escape_char = '`';
      

      改为

      var $_escape_char = ' ';
      

      现在它可以工作了...但是如果我遇到任何安全问题我很害怕..

      谢谢

      【讨论】:

        猜你喜欢
        • 2016-03-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-28
        • 1970-01-01
        相关资源
        最近更新 更多