我有这个Mysql数据库表(存储我的应用程序的一些设置):
Table name: settings
id param_name param_value
--------------------------------
1 ringtone 12.mp3
2 user nick
3 email nick@example.com
4 location Athens, Greece
5 phone 0123456789
6 time_offset GMT+3
"id"列只是自动增量,从mysql获取值。
列"param_name"有一些初始值(例如:ringtone, user…等)
列"param_value"动态地从"settings"表单中获取它的值,以便每个参数都有它唯一的值。
我想用一个查询选择这些所有行,并将它们中的每一个转换为一个变量,如:
$this_ringtone = "12.mp3";
$this_user = "nick";
$this_email = "nick@example.com";
$this_location = "Athens, Greece";
$this_phone = "0123456789";
$this_time_offset = "GMT+3";
我可以用多个查询做到这一点,但由于行实际上更多,我更喜欢单个mysqli查询。
这很难以您想要的方式实现,因为所有值的列名都是相同的-但是您希望将不同的值放入特定的变量中。相反,你应该翻转桌子,使它看起来像这样
| ID | ringtone | user | email | location | phone | time_offset |
+-----+----------+------+------------------+----------+-------+-------------+
| 1 | 12.mp3 | nick | nick@example.com | Greece | 12345 | UTC+3 |
| 2 | 25.mp3 | joe | joe@example.com | France | 54321 | UTC+3 |
+-----+----------+------+------------------+----------+---------------------+
你现在可以使用如下代码
$result = mysqli_query($link, "SELECT * FROM table");
while ($row = mysqli_fetch_assoc($result)) {
$id = $row['id'];
$ringtone = $row['ringtone'];
$user = $row['user'];
...
...
$time_offset = $row['time_offset'];
}
…等等......这是因为您根据列的名称获取单元格的值,在您的示例中只有param_name
和param_value
。因此,您无法真正知道何时应该将它们放入适当的变量中,除非表是静态的(永远不会更改,所以您可以硬编码它-坏习惯),或者每个用户总是有6行-但如果是这种情况,无论如何,您更容易执行如上所示的结构。
注意如果上面的结构中有不同行的值,那么您只能以这种方式获得最后一个值(因为我们选择了所有内容,并将其放入每行的变量中)。所以对于这个例子,你只会得到id: 2
和France-guy(而不会得到id: 1
或greek -guy),所以如果你有很多行,你的查询应该是不同的。这是因为id: 2
是表中的最后一行。
更优雅的是,您可以使用PHP函数
extract()
,如下所示
$result = mysqli_query($link, "SELECT * FROM table");
$row = mysqli_fetch_assoc($result);
extract($row); // Extract the values of the array into a variable of its own
echo $user; // Name of variable is the same as the column in the database
希望这对你的表结构应该是什么样子提供一些明确的指导。
是的,所以无论出于什么原因,你不想要上面的表结构,使用变量变量,你只需要一个查询。像这样
$values = array();
$result = mysqli_query($link, "SELECT * FROM table");
while ($row = mysqli_fetch_assoc($result)) {
${$row['param_name']} = $row['param_value'];
}
echo $ringtone;
这将创建一个变量,其名称为$row['param_name']
中的值,该变量的值为$row['param_value']
。实际上比我想象的要容易得多。
如果您希望变量名为$this_name
,只需使用${"this_".$row['param_name']} = $row['param_value'];
您应该将您的param_name
列设置为数据库中唯一的,以避免变量被覆盖。
使用*选择器选择所有行。
$link = mysqli_connect("localhost", "my_user", "my_password", "database");
$result = mysqli_query($link, "SELECT * FROM table");
while($row= mysqli_fetch_array($result,MYSQLI_ASSOC){
$ringtone = $row['ringtone'];
$user = $row['user'];
}
如果你想把它们构建成数组..
$one = array();
$link = mysqli_connect("localhost", "my_user", "my_password", "database");
$result = mysqli_query($link, "SELECT * FROM table");
while($row= mysqli_fetch_array($result,MYSQLI_ASSOC){
$one['ringtone'] = $row['ringtone'];
$one['user'] = $row['user'];
}
在纠结了一会儿之后,我想到了一个可行的解决方案:
$conn = mysqli_connect("localhost", "my_user", "my_pass", "database");
$query = mysqli_query($link, "SELECT * FROM settings");
$result = array();
while($row1 = mysqli_fetch_row($query)){
$param_name = $row1[2];
$query2 = mysqli_query($conni, "SELECT `param_value` FROM ".DB_TABLE_PREFIX."settings WHERE param_name = '$param_name' ");
$row2 = mysqli_fetch_assoc($query2);
$result[] = array($param_name => $row2["param_value"]);
}
echo json_encode($result);
现在,我得到了这个可以在我的应用程序中使用的数组:
[{"ringtone":"12.mp3"},{"user":"nick"},{"email":"nick@example.com"},{"location":"Athens, Greece"},{"phone":"0123456789"},{"time_offset":"GMT+3"}]
非常感谢大家的时间和回答。t .