PHP ADOdb Active Record :: Replace()bug(或功能?)

时间:2012-03-21 16:30:11

标签: php mysql adodb

以下是我的代码:

$user->user_id = 3;
$user->email='';
$user->password=md5('123456');
$user->Replace();

然后它生成一个sql:

UPDATE pre_user SET email=,password='e10adc3949ba59abbe56e057f20f883e' WHERE user_id=3

就像你看到的那样,没有带空字符串的引用。然后我按照代码在adodb-active-record.inc.php:631上运行doquote(),发现代码如下:

    case 'C'://I think this means 'Char' and email field should be this.
    case 'X':
        if (is_null($val)) return 'null';

        if (strlen($val)>0 && 
            (strncmp($val,"'",1) != 0 || substr($val,strlen($val)-1,1) != "'")) { 
            return $db->qstr($val);
            break;
        }

它告诉strlen($ val)> 0 ...

为什么它不为空字符串添加引号?

2 个答案:

答案 0 :(得分:0)

$user->email=''不为null且长度为0且doquote()未处理此特定方案。

您可以尝试:

$user->email = NULL;

但您的数据库必须允许该字段的NULL值。

答案 1 :(得分:0)

我使用adodb-active-record遇到了同样的错误。我相信 adodb-datadict.inc.php 中的 MetaType 查找功能负责将您的电子邮件列分类为映射到'X'的'LVARCHAR'。

这就是为什么doquote代码没有捕获长度为零的字符串情况。

我通过将调整大小写'X'添加到我的代码库中来解决这个问题:

 case 'X':
    if (is_null($val)) return 'null';

    if (strlen($val)>0 &&
        (strncmp($val,"'",1) != 0 || substr($val,strlen($val)-1,1) != "'")) {
        return $db->qstr($val);
        break;
    }
    else {
        return 'null';
        break;
    }