在php中使用一个键来表示多个值

时间:2016-07-01 19:17:00

标签: php

我正在php开发一个webaplicattion,其中会有一个名为'My Products'的区域。您可以在此区域查看列出的产品。让我们说你卖了一辆车。你会有类似的东西:

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

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

我正在使用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. 让所有其他选项成为价值(柴油,黄色等......)
  4. 我从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);
                }
            }   
    
        }
    }
    

    我不知道这是否是正确的方法,因为它是我正在构建的第一个webapp。 我只是在这段代码中使用模型值来实现简单性。

3 个答案:

答案 0 :(得分: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作为外键存储到表用户的主键ID中

将节省更多存储空间,使查询更快(查找数字比查找字符串更容易),用户可以更改其名称而无需在所有其他表格中更改其名称(userid赢了& #39;当然要改变了)

如果想知道为什么10看到帖子MySQL datatype INT(11) whereas UNSIGNED INT(10)?

,也应该unsigned int(10)而不是int(11)

答案 1 :(得分:1)

  

您可以执行以下操作

注意这个查询不安全并且是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;
}   

答案 2 :(得分: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
    );
}