【问题标题】:Number goes wrong in to database in PHP [duplicate]PHP中的数据库出现错误[重复]
【发布时间】:2017-11-09 08:07:44
【问题描述】:

我有一种情况,我必须将电话号码添加到数据库中。 如果我输入类似的数字:868150705 它可以进入数据库 如果我输入这样的内容:3706150705 它进入数据库,值为2147483647

通过这个输入,我将值从表单中取出

<input type="text" class="demoInputBox" maxlength="20" name="telefonas" value="<?php if(isset($info['tel_nr'])) echo $info['tel_nr']; ?>">

通过这个查询,我将它放入数据库(我有$username

$telnr = $_POST['telefonas'];
$db_handle = new mysqli("localhost", "root", "xxx", "Database");
$query = "UPDATE table SET tel_nr = '$telnr' WHERE username = '$username'";
$result = $db_handle->query($query);

我的字段 tel_nr 具有以下格式:

tel_nr int(20)

你能帮我用这个奇怪的魔法吗?顺便说一句,我知道这段代码不安全,但该项目目前还没有上线。只是测试一下。

【问题讨论】:

  • 电话号码不能是整数,试试varchar。
  • 您可以使用此代码进行 SQL 注入
  • 这是int的极限
  • 1.使用准备好的语句。 2. 不要引用数字。 3. 不要将int 数据类型用于电话号码。 4. 代码不活跃和“仅用于测试”不是放松将变量注入 SQL 的坏习惯的有效借口。 5. 见编号。 1 和 4。

标签: php sql


【解决方案1】:

您正在尝试将大于 int 限制的整数放入数据库。我建议为此使用 VARCHAR(电话号码无论如何都不是整数 - 考虑像 +420 730 500 600 之类的东西)。此外,您不会在尝试将数据放入数据库之前对其进行转义,因此它很容易受到 SQL 注入的攻击。

希望对你有帮助,有问题可以留言

【讨论】:

    【解决方案2】:

    我建议为 tel_nr 切换到 BIGINT,因为它默认为 64 位,而 int 为 32 位 (2147483647=2^31-1)。 INT(20) 中的 20 指定 mysql 显示的字符数,因此在您的情况下,零填充将显示 2147483647 前面有 10 个零

    更新: 找到我读过的地方 https://stackoverflow.com/a/4769436/6054257

    【讨论】:

    • int 是 32 位,bigint 是 64 位是正确的,但这与系统是 32 位还是 64 位完全无关。
    • 我的错误。我应该在发布之前验证 32 位系统评论。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-04
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 2021-08-20
    • 1970-01-01
    相关资源
    最近更新 更多