php ve mysql verilerini gösteren değil, foreach döngüsüne girmeden değil

4 Cevap php

I am having trouble with modifying a php application to have pagination. My error seems to be with my logic, and I am not clear exactly what I am doing incorrectly. I have had before, but am not currently getting errors that mysql_num_rows() not valid result resource and that invalid arguments were supplied to foreach. I think there is a problem in my logic which is stopping the results from mysql from being returned.

Bütün "test" yankılanırken döngü while test dışında çıkış vardır. Bir sayfa sorgunun adı ve kelime ihaleleri, birinci ve önceki bağlantıları değil, sonraki ve son bağlantıları ile oluşturulur. Benim tabloda satırlar için link üreten bir daha verimli bir şekilde yerine hücre başına bir bağlantı yapma, işaret olabilir eğer ben minnettar olacaktır. Birkaç öğeler için sürekli bir bağlantı olması mümkün mü?

<?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: Ben yok oldu hangi mysql hatası dışında basılmış. Ancak 8 "test whiles" 100'den fazla kayıtları ile bir veritabanından, yazdırılır. Foreach döngü entereded, ve ben neden emin değilim asla.

4 Cevap

Sorun (ya da bunlardan en az biri) okur kodu vardır:

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

$ NumRows değişkeni getRowsByProductSearch tarafından döndürülen sadece normal bir dizidir, bir MySQL resultset değildir.

Okumak için kodu değiştirin:

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

Sonra, en azından sizin için bazı sonuçlar bulmak gerekir.

İyi şanslar, James

, Selam

Sonraki sorun okur hattı ile:

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

Bu okumak için değiştirilmesi gerekir:

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

En az hata ayıklama yaparken script başlamadan aşağıdaki satırları ekleyerek öneriyoruz:

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

Bu ölümcül bir hata kadar atılan ve size zaman bir sürü kaydedilmiş olurdu gibi.

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

Nasıl $ pg set almak için gidiyor? Sen $ _GET onu okuma görünmüyor. Eğer register_globals dayanarak eğer: bunu yapmaz! $ _GET Onu okumak ve başarısız olursa 'geri '1 düşen, pozitif bir tamsayı bunu ayrıştırmak için deneyin.

Sonraki ->

Sen, 'sorgu' diğer parametreleri sayfanızı ihtiyaçlarını kaybetme ve 'cmd' gibi görünür.

Genel olarak ben) çok zor, echo (özellikle girinti-ücretsiz kullanımı kodunuzu okumak için bulma yaşıyorum. Ayrıca "... ... $ şablon" anlatılmamış HTML / script-enjeksiyon açıkları her zaman var ya. () Ing htmlspecialchars'dan olmadan HTML içine bir dize bağlamak.

PHP çiftleşmiş dildir: kullanmak, onunla mücadele etmeyin! Örneğin:

<?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>

Birkaç öğeler için sürekli bir bağlantı olması mümkün mü?

Hücreleri arasında, hayır. Ama gerçekten zaten bir bağlantıyı kullanarak değiliz - bu '#' çapa yere gitmez. Yukarıdaki örnekte yerine tablo satırda OnClick koyar. Tam olarak ne erişilebilirlik için daha uygun uygulama yapmaya çalışıyor tam olarak ne bağlıdır.

. (Yukarıda da diğer karakterleri bir 'id' koymak için geçerli olmayabilir gibi PK, aslında sayısal olduğunu varsayar da "onclick" satır içi çıkarın ve aşağıdaki bir komut dosyası kodu hareketli düşünebilirsiniz - mütevazi "bakın scripting ".)

Bu yanlıştır:

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

Bu olmalıdır:

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

Lütfen getRowsByProductSearch fonksiyonu, bunu ortaya çıkarsa mysql_error sonucunu döndürür. Kod hata ayıklama için, belki de bunun yerine yazdırabilirsiniz, böylece kolayca sorunun ne olduğunu görebilirsiniz.