Создание таблицы из данных MySQL в PHP - PullRequest
0 голосов
/ 07 сентября 2011

Я пытаюсь создать проект, в котором он будет отображать 3 предыдущих месяца и текущий месяц ... теперь моя проблема в том, что я не знаю, где и как отразить эти данные mysql в таблице в php ... может кто-нибудь научил меняпожалуйста?

Прошу прощения, если я не умею объяснять вам систему, потому что я просто старающийся программист ..

Вот как должна выглядеть таблица: http://www.fileden.com/files/2011/7/27/3174077//1.JPG

вот php коды и запрос mysql, которые я хочу поместить в таблицу:

<form action="" method="post" class="niceform">
<fieldset>
    <legend>Job Orders</legend>\
    <table>
<tr>
<th>SSA</th>
<th>Months</th>
</tr>

         <?php

$datefrom= $_POST['timestamp'];
$dateto=$_POST['timestamp1'];

$parsemonth="";
$parseday ="01";

$conditionmonth=$parsemonth-3;


//january
if ($conditionmonth == '1'){

$sql="SELECT
a.specialist_partner_ID
,count(CASE WHEN a.receivedDate between DATE_SUB('2011-01-01', INTERVAL 3 MONTH) and         DATE_SUB('2011-09-30', INTERVAL 3 MONTH) THEN a.job_order_number ELSE null END) As December,
count(CASE WHEN a.receivedDate between DATE_SUB('2011-01-01', INTERVAL 2 MONTH) and  DATE_SUB('2011-09-30', INTERVAL 2 MONTH) THEN a.job_order_number ELSE null END) As November
,count(CASE WHEN a.receivedDate between DATE_SUB('2011-01-01', INTERVAL 1 MONTH) and   DATE_SUB('2011-09-30', INTERVAL 1 MONTH) THEN a.job_order_number ELSE null END) As October 
,count(CASE WHEN a.receivedDate between '2011-01-01' and  '2011-01-30'THEN a.job_order_number ELSE null END) As Jauary
,count(job_order_number) As Total
FROM jo_partner a
WHERE a.receivedDate BETWEEN '2011-01-01' AND '2011-12-31'
GROUP BY a.specialist_partner_ID";
}

//february
else if ($conditionmonth == '2'){

$sql="SELECT
a.specialist_partner_ID
,count(CASE WHEN a.receivedDate between DATE_SUB('2011-02-01', INTERVAL 11 MONTH) and    DATE_SUB('2011-02-29', INTERVAL 3 MONTH) THEN a.job_order_number ELSE null END) As November
,count(CASE WHEN a.receivedDate between DATE_SUB('2011-02-01', INTERVAL 10 MONTH) and  DATE_SUB('2011-02-29', INTERVAL 2 MONTH) THEN a.job_order_number ELSE null END) As December
,count(CASE WHEN a.receivedDate between DATE_SUB('2011-02-01', INTERVAL 9 MONTH) and  DATE_SUB('2011-02-29', INTERVAL 1 MONTH) THEN a.job_order_number ELSE null END) As January
,count(CASE WHEN a.receivedDate between '2011-02-01' and  '2011-02-29'THEN a.job_order_number ELSE null END) As February
,count(job_order_number) As Total
FROM jo_partner a
WHERE a.receivedDate BETWEEN '2011-01-01' AND '2011-12-31'
GROUP BY a.specialist_partner_ID";
}

//march
else if ($conditionmonth == '3')
{

$sql="SELECT
a.specialist_partner_ID
,count(CASE WHEN a.receivedDate between DATE_SUB('2011-03-01', INTERVAL 3 MONTH) and       DATE_SUB('2011-03-31', INTERVAL 3 MONTH) THEN a.job_order_number ELSE null END) As December
,count(CASE WHEN a.receivedDate between DATE_SUB('2011-03-01', INTERVAL 2 MONTH) and  DATE_SUB('2011-03-31', INTERVAL 2 MONTH) THEN a.job_order_number ELSE null END) As Jauary
,count(CASE WHEN a.receivedDate between DATE_SUB('2011-03-01', INTERVAL 1 MONTH) and  DATE_SUB('2011-03-31', INTERVAL 1 MONTH) THEN a.job_order_number ELSE null END) As February
,count(CASE WHEN a.receivedDate between '2011-03-01' and  '2011-03-31'THEN a.job_order_number ELSE null END) As March
,count(job_order_number) As Total
FROM jo_partner a
WHERE a.receivedDate BETWEEN '2011-01-01' AND '2011-12-31'
GROUP BY a.specialist_partner_ID";
}

и так далее и так далее ... до ДЕКАБРЯ

while ($row = mysql_fetch_row($sql)
{

} 
?>
  </tr></table>
</fieldset>

условие: когда я выбираю месяц для просмотра отчета за этот месяц, за исключением января, будут видны только данные за январь, а последние 3 месяца подряд, за декабрь и ноябрь

Ответы [ 3 ]

1 голос
/ 07 сентября 2011

В первом запросе mysql должно быть другое предложение WHERE, чтобы указать требуемую дату.Также, как предлагается в комментариях, вы должны использовать mysql_real_escape_string () для всех данных, поступающих от пользователя, чтобы предотвратить взлом вашей базы данных.

Если в ваших таблицах хранится целое число с php time () при хранении, вы можете заменить три месяца с этого момента (или любой другой месяц по вашему выбору) и поместить его в запрос, как показано здесь:

$january = 1293840000; // january 1st 00:00 unix timestamp
$SSAID = mysql_real_escape_string($SSAID); // injection..
$query = mysql_query("SELECT * FROM user WHERE SSA_ID = '$SSAID' AND timeAdded <= '$january'");

Тогда все, что вам нужно сделать, это перебрать данные, используя

while ($row = mysql_fetch_row($result)
{

} 

и используя heredoc.Например,

$html = <<<HTML
<table>
 blahblah
</table>
HTML;

Надеюсь, это поможет.По запросу будет предоставлен код, но этих предложений должно быть достаточно для получения того, что вы хотите ..

РЕДАКТИРОВАТЬ:

//looping through the mysql results and putting them in a table
$tables = "<table>";
while ($row = mysql_fetch_row($result)) {
    $tables .= "<tr>";   
    foreach ($row as $key => $value) {
        $tables .= <<<HTML
        <td>$value</td>
HTML;
        }
        $tables .= "</tr>";
}

Не могли бы вы дать нам var_dump ($ mysql_fetch_assoc ($ result));результат, так как это даст нам представление о том, что ваш запрос возвращает как результат, поэтому мы можем предоставить точный ответ (скорее код)

1 голос
/ 07 сентября 2011

Учитывая, что таблица строится с использованием данных такого типа:

<tr>
  <td>item1</td>
  <td>item2</td>
</tr>

Очень просто построить таблицу с использованием SQL, просто заключите в скобки данные, используя теги таблицы:

Код только для SQL, не рекомендуется, поскольку он оставляет дыру в безопасности XSS!
Используйте это только если вы на 100% уверены, что данные в вашей БД безопасны

/*escape all data coming from a user */
/*or even better just escape all incoming data *period* */
$SSAID = mysql_real_escape_string($_SESSION['SESS_SSA_ID']);

/*don't use 2 queries if you can do it in one */  
$result = mysql_query("SELECT CONCAT('<tr>',GROUP_CONCAT(
                              CONCAT('<td>',ug.group_name,</td>), SEPARATOR ' ')
                              ,'</tr>') as tablestring 
                      FROM user_group ug
                      INNER JOIN user u ON (ug.usr_group_ID = u.user_group_id)
                      WHERE u.SSA_ID = ''$SSAID' )";

$row = mysql_fetch_row($result);
echo "here comes the table";
echo $row['tablestring'];

Этот код создает всю таблицу в SQL. Другой вариант - зациклить значения и соединить таблицу в цикле while:

Пример кода с использованием цикла while, экранирует выход, предотвращая XSS

$result = mysql_query("SELECT ug.group_name 
                      FROM user_group ug
                      INNER JOIN user u ON (ug.usr_group_ID = u.user_group_id)
                      WHERE u.SSA_ID = ''$SSAID' )";
$table = "<tr>";
while ($row = mysql_fetch_row($result));
{
  $table .= "<td>".htmlspecialchars($row['group_name'], ENT_QUOTES, 'UTF-8')."</td>";
}
$table .= "</tr>";
echo "here comes the table";
echo $table;

Очки для запоминания

  • Используйте mysql_real_escape_string() на всех $vars, которые вы вводите в SQL-оператор.
  • Всегда экранируйте данные, которые вы выводите на экран, используя htmlspecialchars() для предотвращения XSS.
  • Выйдите из привычки select *, выберите только то, что вам нужно.
  • Не используйте два запроса и используйте php в качестве курьера между ними, используйте вместо этого один запрос, см. Учебник по объединениям SQL.

Ссылки
SQL-инъекция: Как работает SQL-инъекция из комикса XKCD «Таблицы Бобби»?
Предотвращение XSS: Как предотвратить XSS с помощью HTML / PHP?
Учебник по php-MySQL: http://www.tizag.com/mysqlTutorial/
group_concat: http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat

1 голос
/ 07 сентября 2011

Не знаю, правильно ли я понял, но вот моя попытка.

Создайте таблицу с ее заголовками:

<table>
<tr>
<th>Header 1</th>
<th>Header 2</th>
</tr>

Теперь вы можете заполнить ее данными, которые выполучил от вашего MySql Query.Я не знаю, как структурированы ваши данные, но один из способов сделать это был бы так:

<?php
    foreach($groupName as $group){
        echo "
            <tr>
                <td>".$group->a."</td>
                <td>".$group->b."</td>
            </tr>
        ";
    }
?>

Теперь просто закройте таблицу.

Опять же, я не очень хорошо понял, чтоВы стремитесь, но я надеюсь, что это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...