php и mysql не показывают данные, не входят в цикл foreach - PullRequest
0 голосов
/ 02 февраля 2009

У меня проблемы с модификацией php-приложения, чтобы иметь нумерацию страниц. Кажется, моя ошибка связана с моей логикой, и мне не совсем ясно, что я делаю неправильно. Я имел раньше, но в настоящее время не получаю ошибки, что mysql_num_rows () не является допустимым ресурсом результата и что неверные аргументы были предоставлены для foreach. Я думаю, что в моей логике есть проблема, которая мешает возвращению результатов из mysql.

Выводятся все мои "тестовые" эхо, кроме тестирования while loop. Страница генерируется с именем запроса и словом аукционов, а также с первой и предыдущей ссылками, но не со следующей и последней ссылками. Я был бы признателен, если бы вместо создания ссылки на ячейку указывался более эффективный способ создания ссылок для строк в моей таблице. Можно ли иметь непрерывную ссылку на несколько предметов?

<?php
if (isset($_GET["cmd"]))
  $cmd = $_GET["cmd"]; else
die("You should have a 'cmd' parameter in your URL");
$query ='';
if (isset($_GET["query"])) {
    $query = $_GET["query"];
}
if (isset($_GET["pg"]))
{ 
 $pg = $_GET["pg"];
 }
  else $pg = 1;
$con = mysql_connect("localhost","user","password");
echo "test connection<p>";
if(!$con) {
    die('Connection failed because of' .mysql_error());
}
mysql_query('SET NAMES utf8');
mysql_select_db("database",$con);
if($cmd=="GetRecordSet"){
    echo "test in loop<p>"; 
    $table = 'SaleS';
    $page_rows = 10;
    $max = 'limit ' .($pg - 1) * $page_rows .',' .$page_rows;
    $rows = getRowsByProductSearch($query, $table, $max);
    echo "test after query<p>";
    $numRows = mysql_num_rows($rows);
    $last = ceil($rows/$page_rows);
    if ($pg < 1) {
        $pg = 1;
    } elseif ($pg > $last) {
        $pg = $last;
    }
    echo 'html stuff <p>';

    foreach ($rows as $row) {

echo "test foreach <p>";
        $pk = $row['Product_NO'];
        echo '<tr>' . "\n";
        echo '<td><a href="#" onclick="updateByPk(\'Layer2\', \'' . $pk . '\')">'.$row['USERNAME'].'</a></td>' . "\n";
        echo '<td><a href="#" onclick="updateByPk(\'Layer2\', \'' . $pk . '\')">'.$row['shortDate'].'</a></td>' . "\n";
        echo '<td><a href="#" onclick="updateByPk(\'Layer2\', \'' . $pk . '\')">'.$row['Product_NAME'].'</a></td>' . "\n";
        echo '</tr>' . "\n";
    }
    if ($pg == 1) {
    } else {
        echo " <a href='{$_SERVER['PHP_SELF']}?pg=1'> <<-First</a> ";
        echo " ";
        $previous = $pg-1;
        echo " <a href='{$_SERVER['PHP_SELF']}?pg=$previous'> <-Previous</a> ";
    }
    echo "---------------------------";
    if ($pg == $last) {
    } else {
        $next = $pg+1;
        echo " <a href='{$_SERVER['PHP_SELF']}?pg=$next'>Next -></a> ";
        echo " ";
        echo " <a href='{$_SERVER['PHP_SELF']}?pg=$last'>Last ->></a> ";
    }
    echo "</table>\n";
}
echo "</div>";
function getRowsByProductSearch($searchString, $table, $max) {
    $searchString = mysql_real_escape_string($searchString);
    $result = mysql_query("SELECT Product_NO, USERNAME, ACCESSSTARTS, Product_NAME, date_format(mycolumn, '%d %m %Y') as shortDate FROM {$table} WHERE upper(Product_NAME) LIKE '%" . $searchString . "%'" . $max);
    if($result === false) {
        echo mysql_error();
    }
    $rows = array();
    while($row = mysql_fetch_assoc($result)) {
        echo "test while <p>";
        $rows[] = $row;
    }
    return $rows;
    mysql_free_result($result);
}

edit: я распечатал ошибку mysql, которой не было. Однако из базы данных, содержащей более 100 записей, выводятся 8 «тестовых моментов». Цикл foreach никогда не используется, и я не уверен, почему.

Ответы [ 4 ]

1 голос
/ 02 февраля 2009

Проблема (или хотя бы один из них) заключается в коде, который гласит:

$rows = getRowsByProductSearch($query, $table, $max);
$numRows = mysql_num_rows($rows);

Переменная $ numRows не является набором результатов MySQL, это просто обычный массив, возвращаемый getRowsByProductSearch.

Измените код на:

$rows = getRowsByProductSearch($query, $table, $max);
$numRows = count($rows);

Тогда он должен хотя бы найти некоторые результаты для вас.

Удачи, Джеймс

Привет,

Следующая проблема связана со строкой, которая гласит:

$last = ceil($rows/$page_rows);

Следует изменить следующим образом:

$last = ceil($numRows / $page_rows);

Рекомендовал бы добавить следующие строки в начало вашего скрипта хотя бы при отладке:

ini_set('error_reporting', E_ALL | E_STRICT);
ini_set('display_errors', 'On');

Так как это привело бы к фатальной ошибке и сэкономило бы вам много времени.

1 голос
/ 02 февраля 2009

if (! (Isset ($ pg)))) { $ pg = 1; }

Как установить $ pg? Вы, кажется, не читаете его из $ _GET. Если вы полагаетесь на register_globals: не делайте этого! Попробуйте прочитать его из $ _GET и разобрать в положительное целое число, возвращаясь к «1» в случае неудачи.

Далее ->

Вы, похоже, теряете другие параметры, которые нужны вашей странице, 'query' и 'cmd'.

В общем, мне очень трудно читать ваш код, особенно без использования отступов echo (). Также у вас есть невыразимые уязвимости в HTML / script-инъекциях каждый раз, когда вы "... $ template ..." или .concatenate строка в HTML без использования htmlspecialchars ().

PHP - это язык шаблонов: используйте его, не боритесь с ним! Например:

<?php
    // Define this to allow us to output HTML-escaped strings painlessly
    //
    function h($s) {
        echo(htmlspecialchars($s), ENT_QUOTES);
    }

    // Get path to self with parameters other than page number
    //
    $myurl= $_SERVER['PHP_SELF'].'?cmd='.urlencode($cmd).'&query='.urlencode($query);
?>

<div id="tableheader" class="tableheader">
    <h1><?php h($query) ?> Sales</h1>
</div>
<div id="tablecontent" class="tablecontent">
    <table border="0" width="100%"> <!-- width, border, cell width maybe better done in CSS -->
        <tr>
            <td width="15%">Seller ID</td>
            <td width="10%">Start Date</td>
            <td width="75%">Description</td>
        </tr>
        <?php foreach ($rows as $row) { ?>
            <tr id="row-<?php h($row['Product_NO']) ?>" onclick="updateByPk('Layer2', this.id.split('-')[1]);">
                <td><?php h($row['USERNAME']); ?></td>
                <td><?php h($row['shortDate']); ?></td>
                <td><?php h($row['Product_NAME']); ?></td>
            </tr>
        <?php } ?>
    </table>
</div>
<div class="pagercontrols">
    <?php if ($pg>1) ?>
        <a href="<?php h($myurl) ?>&amp;pg=1"> &lt;&lt;- First </a>
    <?php } ?>
    <?php if ($pg>2) ?>
        <a href="<?php h($myurl) ?>&amp;pg=<?php h($pg-1) ?>"> &lt;-- Previous </a>
    <?php } ?>
    <?php if ($pg<$last-1) ?>
        <a href="<?php h($myurl) ?>&amp;pg=<?php h($pg+1) ?>"> Next --> </a>
    <?php } ?>
    <?php if ($pg<$last) ?>
        <a href="<?php h($myurl) ?>&amp;pg=<?php h($last) ?>"> Last ->> </a>
    <?php } ?>
</div>

Можно ли иметь непрерывную ссылку для нескольких элементов?

Через клетки нет. Но вы все равно не используете ссылку - эти «#» якоря никуда не денутся. В приведенном выше примере вместо этого помещается щелчок на строке таблицы. Что именно больше подходит для доступности, зависит от того, что именно ваше приложение пытается сделать.

(Выше также предполагается, что PK на самом деле является числовым, поскольку другие символы могут быть недопустимыми для вставки 'id'. Вы также можете рассмотреть возможность удаления встроенного "onclick" и перемещения кода в скрипт ниже: см. "ненавязчивый сценарий".)

0 голосов
/ 02 февраля 2009

В вашей функции getRowsByProductSearch вы возвращаете результат mysql_error, если он возникает. Для того, чтобы отладить код, возможно, вы можете распечатать его, чтобы вы могли легко увидеть, в чем проблема.

0 голосов
/ 02 февраля 2009

Это неправильно:

if($cmd=="GetRecordSet")
echo "test in loop\n"; {

Должно быть:

if($cmd=="GetRecordSet") {
    echo "test in loop\n";
...