- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
所以我想填充并显示一个HTML表,它有两列宽。但是,不管我做什么,我的数据总是粘在一起的。
问题是,我真的想把所有的数据放到一个表中,按起始字母排序。
这是我的代码:
<?php include_once 'Database/dbh.php'; ?>
<!DOCTYPE html>
<html>
<body>
<?php
$fetch = "SELECT DISTINCT Kategori, LEFT(Kategori, 1) AS Letter FROM kategorier ORDER BY Kategori;";
$result = mysqli_query($conn, $fetch);
$resultCheck = mysqli_num_rows($result);
if ($resultCheck > 0) {
while ($row = mysqli_fetch_assoc($result)) {
if (!isset($lastLetter) || $lastLetter != $row['Letter']) {
$lastLetter = $row['Letter'];
echo "<h2>", $row['Letter'], "</h2>";
}
echo "<table><tr><td>" . $row['Kategori'] . "</td></tr></table>";
}
}
?>
</body>
</html>
最佳答案
很抱歉让你失望,但解决办法比你想象的要复杂得多。正如我所见,“艾恩伯已经建议了。所以,如果他写了一个答案,那么首先考虑他的答案是公平的。
建议
关于关注点的分离:
现在让我首先说,为了将来,你应该熟悉Separation of Concerns原则。简单地说,以你的代码为例:总是将涉及数据库访问的代码(用于获取数据、更新等)与显示数据的代码(例如页面的html部分)分开。
这意味着,如果需要从数据库中获取数据,请在网页顶部执行此操作,并将其保存在数组中。然后只需在网页的html部分中使用这些数组,而不是像mysqli_query
或mysqli_fetch_assoc
等与db相关的函数。为了清楚起见,请参阅我提供的代码的html部分(“index.php”)。
这种方法的一大优点是,您可以将整个php代码从页面顶部移动到php函数或类方法中。然后数组将只包含调用这些函数/方法所产生的数据。
以上所有陈述的要点是什么?随意处理php代码和网页顶部的数据,并将结果保存在php数组中。最后,数组应该具有这样的结构,这样网页的html部分的工作将非常简单:只读取和显示数组元素。
所以不要把html代码和db相关的代码混合在一起。如果你这样做了,那么代码就太难维护了。
关于从php打印客户端代码:
您应该记住的另一个重要约定是,不要使用php代码打印任何客户端代码。例如,不要使用像echo "<table><tr><td>"...
这样的语句。在这种情况下,只需将要显示的内容保存到变量中,并根据需要将其显示在网页的html部分。
关于准备好的陈述:
如果需要执行带参数的sql语句,则使用prepared statements(在本例中不使用echo
)。他们会保护你的代码不被最终的sql injections。为了完成,在这个答案的末尾,我发布了一个使用准备好的语句而不是mysqli::query
的示例。
问题的解决方案:
步骤:
关于我准备的解决方案,它包括四个步骤:
从数据库中获取数据并将其保存到数组中(index.php
)。
首先,创建第二个数组(mysqli::query
)。然后遍历$data
并以这种方式将其项保存到$formattedData
中,以便它们可以很容易地显示在所选的html结构中(字母$data
,类别$formattedData
)。
遍历div
并在每个字母的最后一个category行中为每个缺少的category追加一个category name为table
的项。抱歉,我在这里写了一句话,但是,如果您阅读我代码中的注释,您一定会更好地理解我的意思。
通过遍历$formattedData
并读取其值,在页面的html部分显示数据。
当然,您可以根据需要优化php代码和/或将其分发到两个三个函数中。然后您可以调用它们并将它们的返回值赋给null
和$formattedData
变量。
注:
如果您使用我的连接代码,不要忘记用您的数据库凭据替换我的数据库凭据。
index.php索引
<?php
require 'Database/dbh.php';
$sql = 'SELECT
DISTINCT Kategori,
LEFT(Kategori, 1) AS Letter
FROM kategorier
ORDER BY Kategori';
$result = mysqli_query($conn, $sql);
/*
* Fetch all data at once, into an array like this:
*
* Array
* (
* [0] => Array
* (
* [Kategori] => Artiskok
* [Letter] => A
* )
*
* [1] => Array
* (
* [Kategori] => Asiatisk
* [Letter] => A
* )
*
* [2] => Array
* (
* [Kategori] => Burger
* [Letter] => B
* )
*
* [...] => [...]
*
* )
*/
$data = mysqli_fetch_all($result, MYSQLI_ASSOC);
/*
* Free the memory associated with the result. You should
* always free your result when it is not needed anymore.
*
* @link http://php.net/manual/en/mysqli-result.free.php
*/
mysqli_free_result($result);
/*
* Close the previously opened database connection. Not really needed because
* the PHP engine closes the connection anyway when the PHP script is finished.
*
* @link http://php.net/manual/en/mysqli.close.php
*/
mysqli_close($conn);
/*
* Iterate through the fetched data and save it into a new array, with a structure suited for the
* required HTML display. To each letter, a list of category rows is assigned. The new array will
* look like this, when the maximal number of categories per category row is 2:
*
* Array
* (
* [A] => Array
* (
* [0] => Array
* (
* [0] => Aoiuoiiiu
* [1] => Aqewroiuoiiu
* )
*
* [1] => Array
* (
* [0] => Artiskok
* [1] => Asiatisk
* )
*
* [2] => Array
* (
* [0] => Azkajhsdfjkh
* )
*
* )
*
* [B] => Array
* (
* [0] => Array
* (
* [0] => Bhaskdfhjkh
* [1] => Biuzutt
* )
*
* [1] => Array
* (
* [0] => Burger
* )
*
* )
*
* [...] => [...]
*
* )
*/
$formattedData = [];
// The maximal number of categories per each category row.
$maximalNumberOfCategoriesPerCategoryRow = 2;
// The number of categories per current category row.
$numberOfCategoriesPerCurrentCategoryRow = 0;
// The index of a category row in the list of all category rows assigned to a letter.
$indexOfCurrentCategoryRow = 0;
foreach ($data as $item) {
$letter = $item['Letter'];
$category = $item['Kategori'];
if (!array_key_exists($letter, $formattedData)) {
/*
* Assign an item with the current letter as key and an array as value.
* The array holds all category rows for the current letter.
*/
$formattedData[$letter] = [];
// Reset.
$indexOfCurrentCategoryRow = 0;
// Reset.
$numberOfCategoriesPerCurrentCategoryRow = 0;
}
// Append the current category to the current category row for the current letter.
$formattedData[$letter][$indexOfCurrentCategoryRow][] = $category;
// Increment.
$numberOfCategoriesPerCurrentCategoryRow++;
/*
* If the maximal number of categories per category row is reached...
*
* @see "Modulo" operator at https://secure.php.net/manual/en/language.operators.arithmetic.php
*/
if (
$numberOfCategoriesPerCurrentCategoryRow %
$maximalNumberOfCategoriesPerCategoryRow === 0
) {
// Reset.
$numberOfCategoriesPerCurrentCategoryRow = 0;
// Increment.
$indexOfCurrentCategoryRow++;
}
}
/*
* Append an item with "null" as category for each missing category in the last
* category row of each letter. The array holding the formatted data will look
* like this, when the maximal number of categories per category row is 2:
*
* Array
* (
* [A] => Array
* (
* [...] => [...]
*
* [2] => Array
* (
* [0] => Azkajhsdfjkh
* [1] => null
* )
*
* )
*
* [B] => Array
* (
* [...] => [...]
*
* [1] => Array
* (
* [0] => Burger
* [1] => null
* )
*
* )
*
* [...] => [...]
*
* )
*/
foreach ($formattedData as $letter => $categoryRows) {
$lastCategoryRow = end($categoryRows);
$lastCategoryRowKey = key($categoryRows);
$numberOfCategoriesPerLastCategoryRow = count($lastCategoryRow);
$numberOfMissingCategoriesInLastCategoryRow = $maximalNumberOfCategoriesPerCategoryRow -
$numberOfCategoriesPerLastCategoryRow;
for ($i = 0; $i < $numberOfMissingCategoriesInLastCategoryRow; $i++) {
// Append an item with "null" as category.
$formattedData[$letter][$lastCategoryRowKey][] = null;
}
}
//=====================================================================================
//@todo Just for testing: uncomment the next two lines to display the arrays on screen.
//=====================================================================================
//echo '<pre>' . print_r($data, TRUE) . '</pre>';
//echo '<pre>' . print_r($formattedData, TRUE) . '</pre>';
//=====================================================================================
?>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=yes" />
<meta charset="UTF-8" />
<!-- The above 3 meta tags must come first in the head -->
<title>Demo</title>
<link href="custom.css" type="text/css" rel="stylesheet">
</head>
<body>
<h3>
Demo: Print a list of categories per category letter, on multiple columns.
</h3>
<?php
if ($formattedData) { /* Data exists */
foreach ($formattedData as $letter => $categoryRows) {
?>
<div class="categories-container">
<div class="letter">
<?php echo $letter; ?>
</div>
<table class="categories">
<?php
foreach ($categoryRows as $categoryRow) {
?>
<tr>
<?php
foreach ($categoryRow as $category) {
?>
<td>
<?php echo $category; ?>
</td>
<?php
}
?>
</tr>
<?php
}
?>
</table>
</div>
<?php
}
} else { /* No data */
?>
<p class="no-data">
No data found
</p>
<?php
}
?>
</body>
</html>
body {
margin: 0;
padding: 20px;
color: #333;
}
a {
text-decoration: none;
}
.categories-container {
margin-bottom: 10px;
}
.letter {
padding: 10px;
text-align: left;
font-weight: 700;
background-color: #a0c3e5;
}
.categories {
width: 100%;
border-spacing: 1px;
border-collapse: separate;
}
.categories td {
width: 50%;
padding: 10px;
background-color: #f4f4f4;
}
.no-data {
padding: 10px;
background-color: #f4f4f4;
}
<?php
/*
* This page contains the code for creating a mysqli connection instance.
*/
// Db configs.
define('HOST', 'localhost');
define('PORT', 3306);
define('DATABASE', 'tests');
define('USERNAME', 'root');
define('PASSWORD', 'root');
// Error reporting.
error_reporting(E_ALL);
ini_set('display_errors', 1); /* SET IT TO 0 ON A LIVE SERVER! */
/*
* Enable internal report functions. This enables the exception handling,
* e.g. mysqli will not throw PHP warnings anymore, but mysqli exceptions
* (mysqli_sql_exception).
*
* MYSQLI_REPORT_ERROR: Report errors from mysqli function calls.
* MYSQLI_REPORT_STRICT: Throw a mysqli_sql_exception for errors instead of warnings.
*
* @link http://php.net/manual/en/class.mysqli-driver.php
* @link http://php.net/manual/en/mysqli-driver.report-mode.php
* @link http://php.net/manual/en/mysqli.constants.php
*/
$mysqliDriver = new mysqli_driver();
$mysqliDriver->report_mode = (MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
// Create a new db connection.
$conn = mysqli_connect(HOST, USERNAME, PASSWORD, DATABASE, PORT);
CREATE TABLE `kategorier` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`Kategori` varchar(100) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `kategorier` (`id`, `Kategori`)
VALUES
(1,'Artiskok'),
(2,'Asiatisk'),
(3,'Burger'),
(4,'Pizza'),
(5,'Asiatisk'),
(6,'Artiskok'),
(7,'Artiskok'),
(8,'Durum'),
(9,'Durum'),
(10,'Pizza'),
(11,'Chinaboks'),
(12,'Azkajhsdfjkh'),
(13,'Aoiuoiiiu'),
(14,'Aqewroiuoiiu'),
(15,'Bhaskdfhjkh'),
(16,'Biuzutt');
$data
获取数据的示例。注意,我只把数据获取代码放在这里。其余代码与上面
$formattedData
页的omolog部分相同,后者使用
mysqli::query
。
<?php
require 'Database/dbh.php';
/*
* Save the values, with which the database data will be filtered, into variables.
* These values will replace the parameter markers in the sql statement.
* They can come, for example, from a POST request of a submitted form.
*/
$letterParam1 = 'A';
$letterParam2 = 'C';
$letterParam3 = 'P';
/*
* The SQL statement to be prepared. Notice the so-called markers, e.g. the "?" signs. They
* will be replaced later with the corresponding values when using mysqli_stmt::bind_param.
*
* @link http://php.net/manual/en/mysqli.prepare.php
*/
$sql = 'SELECT
DISTINCT Kategori,
LEFT(Kategori, 1) AS Letter
FROM kategorier
WHERE
LEFT(Kategori, 1) = ?
OR LEFT(Kategori, 1) = ?
OR LEFT(Kategori, 1) = ?
ORDER BY Kategori';
/*
* Prepare the SQL statement for execution - ONLY ONCE.
*
* @link http://php.net/manual/en/mysqli.prepare.php
*/
$statement = mysqli_prepare($conn, $sql);
/*
* Bind variables for the parameter markers (?) in the SQL statement that was passed to prepare().
* The first argument of bind_param() is a string that contains one or more characters which
* specify the types for the corresponding bind variables.
*
* @link http://php.net/manual/en/mysqli-stmt.bind-param.php
*/
mysqli_stmt_bind_param($statement, 'sss'
, $letterParam1
, $letterParam2
, $letterParam3
);
/*
* Execute the prepared SQL statement. When executed any parameter markers
* which exist will automatically be replaced with the appropriate data.
*
* @link http://php.net/manual/en/mysqli-stmt.execute.php
*/
mysqli_stmt_execute($statement);
/*
* Get the result set from the prepared statement.
*
* NOTA BENE:
*
* Available only with mysqlnd ("MySQL Native Driver")! If this is not installed, then
* uncomment "extension=php_mysqli_mysqlnd.dll" in PHP config file (php.ini) and restart
* web server (I assume Apache) and mysql service. Or use the following functions instead:
* mysqli_stmt::store_result + mysqli_stmt::bind_result + mysqli_stmt::fetch.
*
* @link http://php.net/manual/en/mysqli-stmt.get-result.php
* @link https://stackoverflow.com/questions/8321096/call-to-undefined-method-mysqli-stmtget-result
*/
$result = mysqli_stmt_get_result($statement);
/*
* Fetch all data at once, into an array like this:
*
* Array
* (
* [0] => Array
* (
* [Kategori] => Artiskok
* [Letter] => A
* )
*
* [1] => Array
* (
* [Kategori] => Asiatisk
* [Letter] => A
* )
*
* [2] => Array
* (
* [Kategori] => Burger
* [Letter] => B
* )
*
* [...] => [...]
*
* )
*/
$data = mysqli_fetch_all($result, MYSQLI_ASSOC);
/*
* Free the memory associated with the result. You should
* always free your result when it is not needed anymore.
*
* @link http://php.net/manual/en/mysqli-result.free.php
*/
mysqli_free_result($result);
/*
* Close the prepared statement. It also deallocates the statement handle.
* If the statement has pending or unread results, it cancels them
* so that the next query can be executed.
*
* @link http://php.net/manual/en/mysqli-stmt.close.php
*/
mysqli_stmt_close($statement);
/*
* Close the previously opened database connection. Not really needed because
* the PHP engine closes the connection anyway when the PHP script is finished.
*
* @link http://php.net/manual/en/mysqli.close.php
*/
mysqli_close($conn);
/*
* ---------------------------------------------------------------------------------------------
* The rest of the page is identical with the omolog part of index.php, which uses mysqli::query
* ---------------------------------------------------------------------------------------------
*/
// ...
关于php - 我如何从mysql中获取数据以表现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52670598/
目前我正在构建相当大的网络系统,我需要强大的 SQL 数据库解决方案。我选择 Mysql 而不是 Postgres,因为一些任务需要只读(MyISAM 引擎)而其他任务需要大量写入(InnoDB)。
我在 mysql 中使用如下命令。当它显示表格数据时,它被格式化为一个非常干净的表格,间距均匀且 |作为列分隔符。 SELECT * FROM TABLE_NAME; 当我从 CLI 运行命令时,如下
我知道这个问题之前已经被问过好几次了,我已经解决了很多问题,但到目前为止没有任何效果。 MySQL 试图将自身安装到的目录 (usr/local/mysql) 肯定有问题。关于我的错误的奇怪之处在于我
以下是我的 SQL 数据结构,我正在尝试如下两个查询: Select Wrk_ID, Wrk_LastName, Skill_Desc from Worker, Skill where
我们有一个本地 mysql 服务器(不在公共(public)域上),并希望将该服务器复制到我们拥有的 google 云 sql 实例。我的问题是:1.这可能吗?2.我们的本地服务器只能在本地网络上访问
我有一个表(test_table),其中一些字段值(例如字段 A、B 和 C)是从外部应用程序插入的,还有一个字段(字段 D),我想从现有表(store_table)插入其值,但在插入前者(A、B 和
我想创建一个 AWS RDS 实例,然后使用 terraform 管理数据库用户。因此,首先,我创建了一个 RDS 实例,然后使用创建的 RDS 实例初始化 mysql 提供程序,以进一步将其用于用户
当用户在我的网站上注册时,他们会在我的一个数据库中创建自己的表格。该表存储用户发布的所有帖子。我还想做的是也为他们生成自己的 MySql 用户——该用户仅有权从他们的表中读取、写入和删除。 创建它应该
我有一个关于 ColdFusion 和 Mysql 的问题。我有两个表:PRODUCT 和 PRODUCT_CAT。我想列出包含一些标记为:IS_EXTRANET=1 的特殊产品的类别。所以我写了这个
我想获取 recipes_id 列的值,以获取包含 ingredient_id 的 2,17 和 26 条目的值。 假设 ingredient_id 2 丢失则不获取记录。 我已经尝试过 IN 运算符
在 Ubuntu 中,我通常安装两者,但 MySQL 的客户端和服务器之间有什么区别。 作为奖励,当一个新语句提到它需要 MySQL 5.x 时,它是指客户端、服务器还是两者兼而有之。例如这个链接ht
我重新访问了我的数据库并注意到我有一些 INT 类型的主键。 这还不够独特,所以我想我会有一个指导。 我来自微软 sql 背景,在 ssms 中你可以 选择类型为“uniqeidentifier”并自
我的系统上有 MySQL,我正在尝试确定它是 Oracle MySQL 还是 MySQL。 Oracle MySQL 有区别吗: http://www.oracle.com/us/products/m
我是在生产 MySQL 中运行的应用程序的新维护者。之前的维护者已经离开,留下的文档很少,而且联系不上了。 我面临的问题是执行以下请求大约需要 10 秒: SELECT COUNT(*) FROM `
我有两个位于不同机器上的 MySQL 数据库。我想自动将数据从一台服务器传输到另一台服务器。比方说,我希望每天早上 4:00 进行数据传输。 可以吗?是否有任何 MySQL 内置功能可以让我们做到这一
有什么方法可以使用 jdbc 查询位于 mysql 根目录之外的目录中的 mysql 表,还是必须将它们移动到 mysql 根目录内的数据库文件夹中?我在 Google 上搜索时没有找到任何东西。 最
我在 mysql 数据库中有两个表。成员和 ClassNumbers。两个表都有一个付费年份字段,都有一个代码字段。我想用代码数字表中的值更新成员表中的付费年份,其中成员中的代码与 ClassNumb
情况:我有 2 台服务器,其中一台当前托管一个实时 WordPress 站点,我希望能够将该站点转移到另一台服务器,以防第一台服务器出现故障。传输源文件很容易;传输数据库是我需要弄清楚如何做的。两台服
Phpmyadmin 有一个功能是“复制数据库到”..有没有mysql查询来写这个函数?类似于将 db A 复制到新的 db B。 最佳答案 首先创建复制数据库: CREATE DATABASE du
我有一个使用 mySQL 作为后端的库存软件。我已经在我的计算机上对其进行了测试,并且运行良好。 当我在计算机上安装我的软件时,我必须执行以下步骤: 安装 mySQL 服务器 将用户名指定为“root
我是一名优秀的程序员,十分优秀!