我有这个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" column只是自动增量并从mysql获取值。
列" param_name"有一些初始值(如:铃声,用户......等)
列" param_value"从"设置动态获取它的值"形式,以便每个参数都具有它的唯一值。
我想用一个查询选择这些所有行,并将它们中的每一个变成一个变量,例如:
$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查询。
答案 0 :(得分:1)
这很难实现您想要的方式,因为列的名称对于所有值都是相同的 - 但是您需要将不同的值放入特定变量中。你应该翻转表格,所以它看起来像这样
| 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
和法国人(而不是id: 1
或希腊人,所以如果你有很多行,你的查询应该是不同的。这是因为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
列设置为 unique ,以避免变量被覆盖。
答案 1 :(得分:0)
只需使用* selector ..
选择所有行$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'];
}
答案 2 :(得分:0)
经过多次努力,我找到了一个有效的解决方案:
$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"}]
非常感谢您的时间和答案。吨。