【问题标题】:How to Use PHP to Retrieve MySQL IDs With Leading Zeros如何使用 PHP 检索带有前导零的 MySQL ID
【发布时间】:2017-05-31 04:54:09
【问题描述】:

我建立了一个新的 MySQL 数据库并创建了一些 PHP 网页。每个条目的 ID 由三位数字组成,并带有前导零(例如,000、001、002)。

我的主页在 HTML 表格中将每个 ID 显示为单独的行,效果很好——它显示了每个条目。但是我的个人条目页面没有返回特定条目。例如,URL entry.php?id=001entry.php?id=002 返回每​​个 ID 的条目。

我认为错误出现在 entry.php 代码的开头,如下所示:

$query = 'SELECT * FROM databasetablename';
if (isset($_GET['id']) && is_numeric($_GET['id']))
{
    $query .= ' WHERE id = ' . (int)$_GET['id'];  
}
$result = mysql_query($query);  

while($row = mysql_fetch_array($result, MYSQL_ASSOC)) {

... 代码继续。但我认为错误在这部分。

【问题讨论】:

  • 最好使用 mysqli 或 pdo 代替 mysql。mysql 已弃用。stackoverflow.com/questions/12859942/…
  • 表中id 字段的数据类型是什么?
  • ID 的数据类型是:int(3) unsigned zerofill。这看起来对吗?我想我是从 Stack Overflow 那里得到的。
  • @N. Scribner 你可以使用str_pad($id,$digits,'0',STR_PAD_LEFT)
  • 注意:事实证明,这个条目页面实际上显示了每个条目,而不仅仅是 000。但它可以与另一个不使用前导零的数据库一起工作。有什么想法吗?

标签: php mysql


【解决方案1】:

您将$_GET['id'] 转换为int,之后$_GET['id'] 现在= 1

【讨论】:

  • 您好,我是一名初学者,所以我不确定我应该做什么。
  • @N.斯克里布纳没关系,你几乎拥有它:)
【解决方案2】:

我假设数据库中的页面 ID 不是数字类型,而是 CHAR/VARCHAR/TEXT。在这种情况下,你应该试试这个:

$query = 'SELECT * FROM databasetablename';
if (isset($_GET['id']) && is_numeric($_GET['id']))
{
    $query .= ' WHERE CAST(id AS INTEGER) = ' . (int)$_GET['id'];  
}
$result = mysql_query($query);

附带说明:考虑使用带有参数绑定的 PDO,而不是直接从请求参数构建查询。这将是极其危险的

$query = ' WHERE CAST(id AS INTEGER) = ' . $_GET['id'];

编辑:您也可以尝试使用mysql_real_escape_string()

$query .= ' WHERE id = ' . mysql_real_escape_string($_GET['id']);

但在这种情况下,您应该在此处阅读有关字符集的安全警告:http://php.net/manual/en/function.mysql-real-escape-string.php

EDIT2:对不起,我现在不能写 cmets,但既然你说它返回每个条目,那只能意味着没有添加 WHERE 条件。使用var_dump($_GET)检查是否真的收到entry.php中的“id”请求参数。

【讨论】:

  • “id”类型其实如下(不知道对不对):int(3) unsigned zerofill
  • 我不确定如何使用 var_dump($_GET),但我用它做了一个回显,它返回了以下内容:array(0) {}。如果您查看我上面的代码,则应添加 WHERE 条件。正如我所说,这个脚本适用于我使用的其他数据库。我认为问题在于前导零。
  • @N.Scribner array(0) {} 表示$_GET 为空,表示isset($_GET['id']) 返回false。这就是为什么没有添加 WHERE 条件的原因。至于缺少id参数的原因:可能有多个。可能是您在.htaccess 中有一个重定向,它在不传递参数的情况下重定向到entry.php。或者entry.php 有一些代码正在从 $_GET 中删除 id。
  • @N.Scribner 如果您在.htaccess 中有一个重定向到 entry.php 的 RewriteRule,请确保它具有 [QSA] 标志。总的来说,如果不了解整个上下文,很难说出真正的原因。
  • @N.Scribner 我还记得.htaccess 的另一件事。当开发人员添加 RewriteRule 时,这是一个常见的错误,如果主机名不以 www 开头,它会重定向到与 www 相同的地址,但忘记添加 [QSA] 标志。这将导致http://example.com/entry.php?id=001 被重定向到http://www.example.com/entry.php。或者这甚至可能由服务器本身完成,具体取决于托管服务提供商的配置方式,但我真的怀疑这一点。
猜你喜欢
  • 2014-09-07
  • 2012-10-09
  • 1970-01-01
  • 1970-01-01
  • 2012-01-14
  • 2014-06-24
  • 2014-09-20
  • 2011-10-26
  • 2014-03-23
相关资源
最近更新 更多