Запрос PHP + MySQL: неожиданные результаты (только для небольшого числа результатов) - PullRequest
0 голосов
/ 24 августа 2011

Попытка показать результаты из БД MySQL на основе даты начала и даты окончания, заданных пользователем. Ниже приведен код:

    //Getting Values From Other Page
$start_date = date("Y-m-d", strtotime($_GET["date3"]));
$end_date = date("Y-m-d", strtotime($_GET["date4"]));

//Server Connection Info
$server = "server_name";
$db_user = "username";
$db_pass = "pass";
$db_name = "dbname";

//Server Connection + Query
$link = mysql_connect($server,$db_user,$db_pass);
if(!$link)
{
    die("Could Not Connect:".mysql_error());
}
mysql_select_db($db_name, $link) or die('Can\'t use db:'. mysql_error());

if ($start_date == $end_date){
    $query = "SELECT col_a, col_b, col_c, col_d FROM main WHERE date='".$start_date."'";
}
else {
    $query = "SELECT col_a, col_b, col_c, col_d FROM main WHERE date BETWEEN '".$start_date."' AND '".$end_date."'";
}
$result = mysql_query($query,$link) or die('Query Error'.mysql_error());
?>
<!-- HTML CODE STARTS HERE -->
<html>
    <head>
        <title></title>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <link rel="stylesheet" href="qc_style.css" />
        <link href='http://fonts.googleapis.com/css?family=Days+One' rel='stylesheet' type='text/css' />
    </head>
    <body>
    <?php
        $row = mysql_fetch_assoc($result);
        $row_count = mysql_num_rows($result);
        echo $row;
        echo $row_count; 
        if($row_count!=0){
            echo "<table>";
            while($row = mysql_fetch_assoc($result))
            {
                echo "<tr><td>";
                foreach($row as $value)
                {
                    echo $value;
                    echo "</td><td>";

                }
                echo "<a href=\"qc_campedit.php?id=".$row['call_id']."\">Edit</a></td></tr>";
            }
            echo "</table>";
        } //end of if statement
        else {echo " Sorry, No records match your query";}
    ?>
    </body>
</html>

У меня в базе данных две строки данных на дату 2011-08-25 и одна строка данных на дату 2011-08-24.

  • Когда я указываю дату начала и окончания как 2011-08-24, я не получаю ответ.
  • Однако, когда я указываю дату начала и дату окончания как 2011-08-25, я получить только одну строку данных, относящихся к 2011-08-25
  • Когда я указываю дату начала как 2011-08-24 и дату окончания как 2011-08-25, я получаю две строки данных, относящихся к 2011-08-25, и строку, принадлежащую 2011-08-25.
  • Однако, когда я указываю дату начала и дату окончания как 2011-08-23, я получаю все 20 строк данных, относящихся к 2011-08-23

Примечание: Количество массивов в $result для этого конкретного таймфрейма отображается правильно. то есть $ row_count = 1 для 2011-08-24 и $ row_count = 2 для 2011-08-24

Как мне решить эту проблему? Заранее спасибо.

Ответы [ 5 ]

1 голос
/ 24 августа 2011

Если вы хотите выбрать меньшее количество столбцов, не используйте «SELECT * FROM ...», вместо этого используйте «SELECT name_of_col_A, name_of_col_B FROM table ...».

Также я рекомендую очистить строку с датой, которую вы принимаете через $ _REQUEST и передаете в свой запрос. Что-то вроде

$start_date = date("Y-m-d", strtotime($_REQUEST["date3"]));

должно хватить.

0 голосов
/ 24 августа 2011

Извините, я не проверяю ваши три варианта использования. Но прежде всего я вижу в вашем коде, что вы выбираете первую строку только для знания "row_count". Я добавил несколько комментариев по этому поводу:

$row = mysql_fetch_assoc($result);  // get row 1 from mysql-result 
$row_count = count($row);  // always the number of attributes returned in one row
echo $row; 
echo $row_count; 
if($row_count!=1) {    // always true

    // fetch lines 2-n and write to table
}

используйте mysql_num_rows (), если вам нужно количество возвращаемых строк.

0 голосов
/ 24 августа 2011

Ваш первый вызов mysql_fetch_assoc () выбирает первый ряд.Затем вы попадаете в свой цикл, и первый из них выбирает следующий ряд, который является первым.Я немного обновил код ниже, чтобы использовать mysql_num_rows () для отображения вашего количества результатов.

<?php
    $row_count = mysql_num_rows($result);
    echo $row_count;
    if($row_count==0) {
        echo "Sorry, no records match your query";
    else {
        echo "<table>";
        while($row = mysql_fetch_assoc($result))
        {
            echo "<tr><td>";
            foreach($row as $value)
            {
                echo $value;
                echo "</td><td>";
            }
            echo "<a href=\"qc_campedit.php?id=".$row['call_id']."\">Edit</a></td></tr>";
        }
        echo "</table>";
    }
?>
0 голосов
/ 24 августа 2011

Только одно, что нужно добавить.Если вы знаете, откуда поступают ваши данные, используйте этот источник специально и избегайте $ _ REQUEST .

Сам по себе он не опасен, но в определенных ситуациях он может представлять угрозу безопасности, поскольку использует резервную систему, которая может фактически извлекать данные из тех мест, куда вы не хотите.Т.е. $ _ REQUEST соответствует вашим EGPCS настройкам, что означает, что если в $ _ ENV не найдено никаких запрашиваемых данных, оно переходит к $ _ GET , $ _ POST , $ _ COOKIE и т. Д., И вы этого не хотите.

Если ваши данные поступают именно из GET , используйте $_GET['date3']

0 голосов
/ 24 августа 2011

BETWEEN - это просто способ указать включающий диапазон.Я думаю, в db у вас есть столбец DATETIME для столбца date, поэтому BETWEEN '2011-08-24' AND '2011-08-24' возвращает только записи с '2011-08-24 0:00:00'.Чтобы сделать то, что вы хотите, вам нужно написать
WHERE DATE(your_datetime_column) BETWEEN '2011-08-24' AND '2011-08-24'

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