【问题标题】:MySQL insert is writing a different value than the one I am enteringMySQL insert 写入的值与我输入的值不同
【发布时间】:2016-05-28 04:00:12
【问题描述】:

我刚刚在 Amazon Linux 实例中设置了 LAMP 服务器。一切正常,我与数据库的所有连接都运行良好。

但是我遇到了一个我无法解决的问题。我正在开发一个考试系统,我想给每个要参加考试的学生一个随机的 ID。我不需要有关学生的任何信息,因此我没有任何可以用作唯一标识符的相关字段。

$id_escuela=2;
$id_grupo=$_POST['grado'];
$id_eval=rand(1,9999999999);
$sql = "INSERT INTO pinion_evalua (id_eval,id_escuela,anio) VALUES (".$id_eval.",".$id_escuela.",".$id_grupo.")";

在我的本地服务器上一切正常,我每次都会得到随机数,但是当我将文件上传到亚马逊服务器时,我会遇到一个特定的数字 (2147483647),即使 rand 的结果不同.例如,我得到:

Error: INSERT INTO pinion_evalua(id_eval,id_escuela,anio) VALUES (4612160288,1,2)
Duplicate entry '2147483647' for key 'id_eval'

这怎么可能?我尝试删除随机部分并使用自动增量,但我仍然收到相同的数字。我什至尝试减小 int 的大小,但我仍然得到数字,即使它违反了该领域的规则。快把我逼疯了。

你们中的任何人都可以给我一些提示吗?

问候。

【问题讨论】:

  • 我不懂 php,但看起来它与 stackoverflow.com/questions/15532635/… 相关
  • 你不需要分配唯一的 id 。使用 id 字段作为主键并自动递增 true。
  • 将 id_eval 字段设为 BigInt
  • 我没有考虑 int 变量在 32 位系统中的限制。我很欣赏避免问题的提示。

标签: php mysql


【解决方案1】:

那几行代码你有很多问题:

  • 您显然是在 32 位系统上运行 PHP,并试图获得比这更大的随机值。
  • 既然您不关心分配的 id,为什么不在 MySQL 中使用自动递增的数字?
  • 您的代码容易受到 SQL 注入的影响,可以通过输入 3); delete pinion_evalua where (1 = 1 轻松演示。正确的解决方案是使用 PHP manual 中记录的准备好的语句。

【讨论】:

  • 代码确实容易被sql注入,虽然php/mysql不支持堆叠查询。
  • 其实有一个“新”的原生函数php.net/manual/en/mysqli.quickstart.multiple-statement.php别管我的评论。
  • 我不确定它有多“新”。可能有十年的历史了。
  • 我明白你的观点,感谢你的更正。使用随机数的想法来自于一种非理性的恐惧,害怕两个孩子同时点击,一个得到 id 而另一个得到错误,这对于大随机数来说会更难。至少那是给我这个想法的程序员的想法。 sql 中的引号用于将字符串与 php 变量连接起来。我相信它们没有被传递到 MySQL 中。如果我错了,请纠正我。我会检查漏洞问题,
  • 自动递增的字段永远不会产生重复。
【解决方案2】:

MySQL 中INT 列的最大值正好是 2147483647。

http://dev.mysql.com/doc/refman/5.7/en/integer-types.html

每当您使用较大的值时,它都会被截断到最大值。您观察到的行为是正确的,并且符合预期。

当列中的最大值也是该列的最大值时,AUTO_INCREMENT 也会出现同样的问题。服务器会尝试加1,值会被截断到最大可能值,插入会失败。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-04
    • 1970-01-01
    • 2011-03-24
    • 2016-09-07
    • 1970-01-01
    • 1970-01-01
    • 2019-03-22
    相关资源
    最近更新 更多