【问题标题】:Would this be sufficient validation of a product ID in php?这是否足以验证 php 中的产品 ID?
【发布时间】:2013-05-02 15:57:50
【问题描述】:

我正在一个非常小的网上商店工作,使用 codeigniter 的项目数量非常有限。

在脚本开始时,products 模型获取整个产品列表并将结果作为数组存储为该模型的属性。

产品 ID 只是数据库中自动递增的主键。因此,当有人将产品添加到购物车时,ID 会通过 POST 发送。然后我检查了三件事:

  • $id 可以是整数吗?
  • 这个整数是否超过产品总数?
  • 此整数是否与产品 ID 匹配?

基本上 - 虽然稍微简化了 - 我这样做:

// Count total number of items
$total = count($this->productArray)

if (!(int)$id || $id > $total)
    return false;

foreach($this->productArray as $product) {
    if ($product['id'] == $id)
        return true;
}

return false;

【问题讨论】:

  • "这个整数是否超过产品总数?" -- 这是一个糟糕的测试,因为自动递增的值不能保证是连续的。例如,如果您有 1、2、4,那么您只有 3 个产品,但 4 是有效 ID。
  • 哇!谢了哥们!太傻了,我自己也应该想到的。

标签: php validation integer int


【解决方案1】:

您错过了使用数据库的主要好处之一,那就是它非常擅长这类事情。

您应该使用类似select * from products where id = :id 的 SQL 查询在数据库中搜索请求的产品,而不是将所有产品加载到内存中,然后在 PHP 中执行您自己的搜索。

【讨论】:

    【解决方案2】:
    Does this integer exceed the total number of products?
    

    这并不总是正确的。一旦他们删除产品,这将不同步。

    也就是说,更好的办法是将 id 转换为整数,并直接在 DB 上查询产品。不检查预加载的数组;这没有任何意义。

    【讨论】:

    • 我很难在这里决定最佳答案,因为你们两个基本上都是一样的。因为 leftclickben 的答案分为对我的问题的评论和一个单独的答案,所以我决定选择这个。
    • 我不担心哪个被标记为正确,但为了记录,我将评论作为评论并将答案作为答案的原因是答案是对您的实际的回应问题,关于非顺序 ID 值的评论更像是一个旁注,一旦你开始使用 SQL,它实际上并不重要。
    猜你喜欢
    • 2018-09-28
    • 2013-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-11
    • 2013-03-10
    • 2023-03-15
    • 2014-08-16
    相关资源
    最近更新 更多