【问题标题】:using one key to multiple values in php在php中使用一个键到多个值
【发布时间】:2016-11-04 06:56:42
【问题描述】:

我正在php 开发一个网络应用程序,其中将有一个名为“我的产品”的区域。这个区域你可以看到你列出的产品。假设您放置了要出售的汽车。你会得到类似的东西:

  • 型号:R8
  • 颜色:黄色
  • 品牌:奥迪
  • 类型:柴油
  • 价格:90000
  • 车牌号:1

我的问题:如何选择卡ID,以便将卡ID作为键,将其他值(例如模型、颜色等)作为值?

我使用mysql 来存储列表。 SQL TABLE:

    +---------+------------------------------------------+------+-----+---------+----------------+
| Field   | Type                                     | Null | Key | Default | Extra          |
+---------+------------------------------------------+------+-----+---------+----------------+
| carid   | int(11)                                  | NO   | MUL | NULL    | auto_increment |
| brand   | enum('Alfa Romeo','Aston Martin','Audi') | NO   |     | NULL    |                |
| color   | varchar(20)                              | NO   |     | NULL    |                |
| type    | enum('gasoline','diesel','eletric')      | YES  |     | NULL    |                |
| price   | mediumint(8) unsigned                    | YES  |     | NULL    |                |
| mileage | mediumint(8) unsigned                    | YES  |     | NULL    |                |
| model   | text                                     | YES  |     | NULL    |                |
| year    | year(4)                                  | YES  |     | NULL    |                |
| user    | varchar(30)                              | YES  |     | NULL    |                |
+---------+------------------------------------------+------+-----+---------+----------------+

我的伪代码是这样的:

  1. 获取某个用户列出的汽车的 ID;
  2. 使用该 ID 作为键;
  3. 获取所有其他选项作为值(柴油、黄色等...)

array_combineforeach inside foreach,我尝试了一些代码。 这是我到目前为止结束的代码:

$qry_id = "select carid from cars where user='$login'";
if ($car_id =  mysqli_query($link, $qry_id)){

    while ($row = mysqli_fetch_assoc($car_id)){
        //It will fetch the iD of the user in the DB
        $user_id = $row["carid"];

        $qry_model = "select model from cars where carid='$user_id'";
        if($model_obj = mysqli_query($link, $qry_model)){

            while ($row_2 = mysqli_fetch_assoc($model_obj)){

                $model = $row_2['model'];
                $final_array = array($user_id => $model);
            }
        }   

    }
}

我不知道这是否是正确的方法,因为这是我正在构建的第一个 web 应用程序。 为了简单起见,我只是在此代码中使用模型值。

【问题讨论】:

  • 为什么选择数据只是为了重新选择数据?在一个循环中? SELECT * FROM cars WHERE user = ? 或者,如果不是 *,您需要的列列表。只需在一个查询中获取您需要的所有数据。 (另请注意,您有一个 SQL 注入漏洞。您需要查看带有查询参数的准备好的语句。)
  • 什么是$value_user_id?它没有在您的代码中定义。
  • @David 我会选择所有内容,但以后如何使用我需要的值?在'$qry_model =“从carid ='$user_id'的汽车中选择模型”;' $valur_user_id 的值会随着每次迭代而改变,对吧?
  • @trincot 我已经更改了代码。我已经复制/粘贴了之前尝试的代码,但忘记更改该变量。
  • @JoaoTorres:您的意思或您要在这里完成的工作并不是很清楚。您用多个名称(汽车 ID 和用户 ID)调用相同的值,那么它到底意味着什么?最终,当你到达这里时你有什么数据,你需要从数据库中得到什么数据?

标签: php


【解决方案1】:

为避免 SQL 注入,请使用准备好的语句。您可以使用一个查询来获取汽车的所有属性:

$qry_id = "select carid, model, price, color from cars where user=?";
$stmt = mysqli_prepare($link , $qry_d) or die("SQL statement error");
// Bind the login parameter to the statement
mysqli_stmt_bind_param($stmt, "s", $login);
mysqli_stmt_execute($stmt);
// bind every column in the SELECT
mysqli_stmt_bind_result($stmt, $user_id, $carid, $model, $price, $color);
while (mysqli_stmt_fetch($stmt)){
    $final_array[] = array(
        "model" => $model,
        "price" => $price,
        "color" => $color
    );
}

【讨论】:

  • 我还是不太明白为什么$login 变量在mysqli_stmt_bind_param($stmt, "s", $login); 上起作用?!我已经阅读了 php 网站上的文档,但仍然没有找到亮点。
  • SQL语句有一个?,表示一个参数。 SQL 引擎可以编译这样的 SQL 语句,但您仍然需要告诉它该参数的值是什么,然后它才能为您提供结果。您可以使用mysqli_stmt_bind_param 执行此操作。 s 表示您的参数是字符串类型。 $login 是参数值本身。这似乎比仅仅将$login 插入 SQL 字符串更复杂,但这是一个坏习惯,因为它会使您的代码容易受到 SQL 注入的攻击。
【解决方案2】:
$q = "SELECT * FROM cars where user=?";
if ($stmt =  $pdo->preapre($q)){
    $result=[];
    $stmt->execute([$login]);
    while ($row = $stmt->fetchObject()){
        $carId = $row->carid;
        unset($row->carid);
        $result[$carId]=$row;
    }
}   

现在注意$pdopdo 连接到数据库的对象而不是mysqli,你可以用mysqli 做同样的事情,但我不习惯它

我也不建议您在每一列上都使用用户名,而应将 userId 作为外键存储到表 user 中的主键 id

这将节省更多的存储空间,使查询更快(查找数字比查找字符串更容易)并且用户可以更改其名称而无需在所有其他表中更改其名称(当然用户 ID 不会更改)

如果想知道为什么 10 人看到那篇帖子 MySQL datatype INT(11) whereas UNSIGNED INT(10)?,也应该是 unsigned int(10) 而不是 int(11)

【讨论】:

    【解决方案3】:

    你可以这样做

    请注意,此查询不安全且易于 SQL 注入,我建议使用准备好的语句或 PDO

    $carArray 变量最终将包含以 carid 作为键的数组

    $query = "select * from cars where user='$login'";
    $result = mysqli_query($query);
    $carArray = array();
    while ($row = mysqli_fetch_assoc($result)){
    $carArray[$row['carid']] = $row;
    }   
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-24
      • 1970-01-01
      • 1970-01-01
      • 2014-04-20
      • 2011-09-18
      相关资源
      最近更新 更多