提示:这可能很明显,但你需要修剪你的字符串,使其适合你通过参数化查询或存储过程保存到数据库字段的字段。(例如:只向 VARCHAR(20) 数据库字段提交最多 20 个字符)。如果你发送的字符串大于查询可以处理的,你将收到错误。
在清理字符串时,你很可能会使用 php substr() 函数。正如文档所述,此函数在遇到空字符串时将返回布尔值 FALSE。不理会此布尔值 FALSE 将导致在你的数据库表中保存“0”,而不是空字符串。
由于修剪输入也很重要,因此针对此问题的简单直观的解决方案是修剪你的 substr() 输出,这将始终提供空字符串,而不是布尔值 FALSE。
因此这将始终有效
<?php
$address_line_2 = trim(substr($_POST['addr2']),0,30));
echo gettype($address_line_2); $sql = "update tblAddressBook set name=(?), addr1=(?), addr2=(?),..."
$params = array($name, $address_line_1, $address_line_2, ...)
$sql_srv_query($db_conn, $sql, $params);
?>
第二种方法将在你的数据库中提供看似意外的数据。
<?php
$address_line_2 = substr(trim($_POST['addr2'])),0,30);
echo gettype($address_line_2); $sql = "update tblAddressBook set name=(?), addr1=(?), addr2=(?),..."
$params = array($name, $address_line_1, $address_line_2, ...)
$sql_srv_query($db_conn, $sql, $params);
?>
你也可以使用以下方法将类型强制转换为字符串,
这将把布尔值 false 强制转换回预期的空字符串。
<?php
$address_line_2 = (string)substr(trim($_POST['addr2'])),0,30);
echo gettype($address_line_2); $sql = "update tblAddressBook set name=(?), addr1=(?), addr2=(?),..."
$params = array($name, $address_line_1, $address_line_2, ...)
$sql_srv_query($db_conn, $sql, $params);
?>
在切换到 IIS7、PHP 5.3.8 和 SQL Server 2008 之前,我没有注意到这种行为。但 IIS7、PHP 5.2 和 SQL Server 2008 也表现出这种行为。