提示:这可能看起来很明显,但是你需要将你的字符串修剪到适合你通过参数化查询或存储过程保存它们的数据库字段中。(例如:只提交最多 20 个字符到 VARCHAR(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 中。