这是我的代码:
$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中的代码执行函数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…
为什么它不在空字符串中添加引号?
$user->email=''
不为null,长度为0,doquote()
不处理此特定场景。
你可以试试:
$user->email = NULL;
但是您的数据库必须允许该字段为NULL值。
我在使用adodb活动记录时遇到了同样的错误。我认为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;
}