我有一个包含一个无符号整型字段来存储访问者的IP地址的数据库表中插入IP地址:PHP /库MySQLi:与mysqli_stmt_bind_param()
`user_ip` INT(10) UNSIGNED DEFAULT NULL,
这里是PHP代码片断它试图存储IP地址:
$ipaddr = $_SERVER['REMOTE_ADDR'];
if ($stmt = mysqli_prepare($dbconn, 'INSERT INTO visitors(user_email, user_ip) VALUES (?,?)'))
{
$remote_ip = "INET_ATON('$ipaddr')";
mysqli_stmt_bind_param($stmt, 'ss', $email, $remote_ip);
if (mysqli_stmt_execute($stmt) === FALSE) return FALSE;
$rows_affected = mysqli_stmt_affected_rows($stmt);
mysqli_stmt_close($stmt);
}
INSERT操作成功,但user_ip字段包含空值。 我也尝试将mysqli_stmt_bind_param()(在上例中设置为字符串)中的参数类型更改为整数,即mysqli_bind_param(...'si',...) - 但无济于事。
我也使用的代码,而不是MySQL的INET_ATON()SQL函数以下位尝试:
function IP_ATON($ipaddr)
{
$trio = intval(substr($ipaddr,0,3));
return ($trio>127) ? ((ip2long($ipaddr) & 0x7FFFFFFF) + 0x80000000) : ip2long($ipaddr);
}
它仍然没有工作 - “user_ip”字段仍设置为null。我试过把mysqli_bind_param()中的整数&字符串传给$ ip_addr变量 - 无济于事。
看来问题在于参数化插入。
下“旧式”代码工作没有任何问题:
mysqli_query(..., "INSERT INTO visitors(user_email, user_ip) VALUES ('$email',INET_ATON('$ipaddr'))");
什么我错在这里做什么?
在此先感谢!
哇!这很快! 谢谢!它现在工作! – invarbrass 2010-05-26 21:37:37
很高兴我可以帮助:)绑定这样的参数的一些要点是让它们安全地插入到数据库中,以确保没有值意外地被解析为例如MySQL函数并正确地转义字符。 – becquerel 2010-05-26 21:54:51
多数民众赞成认为,这是完美的解决方案/。 – AMB 2014-09-08 17:04:58