【问题标题】:PHP mysqli prepared statements removing leading zerosPHP mysqli 准备语句删除前导零
【发布时间】:2013-03-25 21:24:44
【问题描述】:

我试图在我的数据库中输入一个电话号码,该列设置为 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 会返回什么?
  • 以0开头的数字(07123123123)为例

标签: php mysqli prepared-statement


【解决方案1】:

您在问题中提供的准备好的语句没有流程,所以我猜是数据类型的静默转换。

再次检查列number 确实是VARCHAR 类型。 我很确定你在那里有一个 INT (或类似的)类型。

【讨论】:

  • 数字列肯定是 varchar(15)。我用 is_int() 检查了变量,它也定义了不是 int。我怎样才能改善语句的流程?感谢您的帮助
  • 如果您在语句之前的代码中进行赋值为$contactNo=07712123123;,则 PHP 假定它是八进制类型,然后在内部转换为 int,然后作为字符串提交到准备好的语句。检查是否是这种情况。 (但是,您不应该只看到前导零被删除,您应该看到一个完整的“不同”数字,即八进制的十进制表示)。在将$contactNo 变量传递给语句之前,尝试在代码中将其作为字符串处理。
  • 变量是使用 $_POST['contact-no'] 从表单设置的,然后对其进行清理,然后我检查了 is_numeric 是否为真,因此需要将变量转换为字符串并$var = "$var" & $var = strval($var) 但它仍然去掉前导零。我认为它与mysqli_stmt_bind_param($stmt,'ssssss',如果我在数据库中将列设置为十进制11,0并使用'sssssd'它仍然剥离0。
  • 如果 is_numeric 返回 true,则前导零将被删除,您放置的小数 ,0 也将被删除。 is_numeric 也将返回 true,如果它的八进制如我上面所写(即 021231313 是八进制并且将返回 true)。因此,您需要将$_POST['contact-no'] 完全视为字符串,如果您希望它只有数字并使用正则表达式去除其余符号。
  • preg_replace 与正则表达式的示例用法以在字符串中仅保留数字:$contactNo = preg_replace( '/[^0-9]/', '', $_POST['contact-no' );
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多