准备语句去除前导零

3

我正在尝试将电话号码输入到我的数据库中,该列被设置为varchar(15),在phpMyAdmin中它将接受带有前导0的电话号码(例如07712123123)。

在我的PHP脚本中,我有一个变量$contactNo,它是一个包含07712123123的字符串。

但是当我使用准备好的语句将数据输入到数据库中时,前导零被删除了。我如何阻止这种情况发生?

// Insert data into customer_accounts
if($stmt = $mysqli -> prepare("INSERT INTO customer_accounts (username, password, firstname, lastname, email, number) VALUES (?,?,?,?,?,?)")) {
    $stmt -> bind_param("ssssss", $username, $password, $firstname, $lastname, $emailAddress, $contactNo);
    $stmt -> execute();
    $stmt -> close();
}

在这个语句之前和之后,我已经输出了这个变量,0就在那里,因此必须将其删除,因为它被放入了数据库中。我对准备好的语句不熟悉,也不知道该怎么修复它。


如果在if语句开始处输出$contactNo,会返回什么内容? - undefined
例如,带有前导0的数字(07123123123) - undefined
1个回答

1
你提供的预处理语句没有流程,所以我猜测数据类型存在静默转换。
请仔细检查列number是否确实是VARCHAR类型。我相信你那里实际上有一个INT(或类似的)类型。

数字列明确是一个varchar(15)。我已经用is_int()检查了变量,它绝对不是int类型。我该如何改进语句的流程?谢谢帮助。 - undefined
如果在代码中的语句之前进行赋值操作,如`$contactNo=07712123123;` 那么PHP会假设它是八进制类型,然后在提交到预处理语句时将其转换为整数类型。 请检查是否存在这种情况。(但是你不应该只看到前导零被移除,你应该看到一个完全“不同”的数字,即八进制的十进制表示)。尝试在将$contactNo变量传递给语句之前,在代码中将其作为字符串处理。 - undefined
变量是通过使用 $_POST['contact-no'] 从表单设置的,然后进行了清理,并检查 is_numeric 是否为真,所以变量需要转换为字符串,可以使用 $var = "$var" 或者 $var = strval($var),但仍然会去掉前导零。我认为这与mysqli_stmt_bind_param($stmt, 'ssssss',有关。如果我在数据库中将列设置为 decimal 11,0 并使用 'sssssd',它仍然会去掉 0。 - undefined
如果is_numeric返回true,那么前导零将被移除,同时也会移除你放置的小数,0。 正如我之前所写的,如果是八进制,is_numeric也会返回true(例如021231313是八进制且会返回true)。 因此,如果你希望完全将$_POST['contact-no']作为字符串处理,只保留数字并去除其他符号,请使用正则表达式。 - undefined
使用正则表达式的preg_replace的例子,用于从字符串中仅保留数字:$contactNo = preg_replace('/[^0-9]/', '', $_POST['contact-no']); - undefined
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接