以下是我的代码:
$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 ...
为什么它不为空字符串添加引号?
答案 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;
}