0


これは、情報を取得してajaxに送り返すための私のコードです。

else if(isset($_POST['act']) && $_POST['act']=='getbook'){
$book = normalize_str(htmlentities(preg_replace('/\s+/',' ', $_POST['book']), ENT_QUOTES,'UTF-8'));
$filecat = '../books/'.$book.'/'.$book.'.txt';
$catlist = file($filecat, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);

$mysqli = new mysqli($Hostname, $Username, $Password, $DatabaseName);
$stmt = $mysqli->stmt_init();

$query = "SELECT `id`,`title`,`price`,`image`,`description`,`category`,`enablerating`,`rating` FROM ".$PapierTableName." WHERE book = ? ORDER BY position ASC, title ASC;";
$prepared = $stmt->prepare($query);

if($prepared){
    $stmt->bind_param('s', $book);
    $stmt->execute();
    $result = $stmt->bind_result($iden, $title, $price, $image, $description, $category, $enrat, $rating);
    if($result)
    {
        $rit = array();
        while($stmt->fetch())
        {
            $rit[] = array(

                invert_str(html_entity_decode($title, ENT_QUOTES, 'UTF-8')),
                $price,
                invert_str(html_entity_decode($image, ENT_QUOTES, 'UTF-8')),
                invert_str(html_entity_decode($description, ENT_QUOTES, 'UTF-8')),
                invert_str(html_entity_decode($category, ENT_QUOTES, 'UTF-8')),
                $enrat,
                $rating,
                $iden
            );
        }
        $stmt->close();
        $count = count($catlist);
        $ret = array();
        for($i = 0; $i < $count ; $i++)
            $ret= array_merge($ret, search($rit, 4, $catlist[$i]));
        file_put_contents('tre.txt',print_r($ret,true));
        echo json_encode($ret);
    }
    else
        file_put_contents('binderror.txt', $stmt->error);
}
else
    file_put_contents('connecterror.txt',$stmt->error);
}

私の問題は$iden、配列に追加すると機能しなくなることです。つまり、配列がないことを意味します。print_rで印刷すると、出力がありません。(string)$iden


データベースに接続でき、すべての情報がすでにチェックされています(値と存在)
追加情報

なし$iden

Array
(
[0] => Array
    (
        [0] => DB9
        [1] => 200031
        [2] => //localhost/css/images/objectimg/Aston Martin/db9.jpg
        [3] => some html
        [4] => DB9
        [5] => 1
        [6] => 0
    )

[1] => Array
    (
        [0] => Rapid S
        [1] => 200000
        [2] => //localhost/css/images/objectimg/Aston Martin/vanq.jpg
        [3] => some html
        [4] => Rapid S
        [5] => 1
        [6] => 0
    )

)。

$iden

Array
(
)

最後$idenに:

Array
(
[0] => Array
    (
        [0] => DB9
        [1] => 200031
        [2] => //localhost/css/images/objectimg/Aston Martin/db9.jpg
        [3] => some html
        [4] => DB9
        [5] => 1
        [6] => 0
        [7] => 42
    )

[1] => Array
    (
        [0] => Rapid S
        [1] => 200000
        [2] => //localhost/css/images/objectimg/Aston Martin/vanq.jpg
        [3] => some html
        [4] => Rapid S
        [5] => 1
        [6] => 0
        [7] => 45
    )

)。

4

1 に答える 1

1

簡単に言えば、1行に複数の変数を作成することで時間を節約する(またはコードをより美しくする)ことはありません。セミコロンを捨てたら、「Enter」ボタンを押すときです。

誰もあなたに適切な答えを与えることを気にしない理由は、まあ、あなたのコードは本当に読みにくいからです。

まず、コードをより適切に構造化することから始めるべきです。次のようなことも検討する必要があります。

  • 実際に何かが投稿されていることを確認してください。$_POST['book']が存在するとは限りません。
  • ヘルプを求めるときに使用しているすべての変数と関数を示してください。$Hostname、$ Username、$ Password、$DatabaseNameの値が実際に役立つ可能性があります。
  • $ PaperierTableName?クエリで定義するか、名前もクエリにバインドします。
  • クエリを文字列として構造化し、クエリを保持する文字列を準備します。
  • クエリにセミコロンがありません。
  • $ rit [$i]を使用しても意味がありません。$rit[] =を使用すると、配列にデータを追加する場合と同じように機能します。
  • utf8_encodeを見てください。コードが複雑になりすぎていると思います。
  • $ ret = array_merge($ ret、search($ rit、4、$ catlist [$ i]))は、実行するすべてを上書きします。$ ret [] = array_merge($ ret、search($ rit、4、 $ catlist [$ i]));

したがって、このようなものを組み合わせると、はるかに構造化されます。

<?php
$postedBook = isset($_POST['book']) ? $_POST['book'] : false;

if($postedBook != false)
{
    $Hostname = 'localhost';
    $Username = 'root';
    $Password = '';
    $DatabaseName = 'dbName';

    $book = normalize_str(htmlentities(preg_replace('/\s+/',' ', $postedBook), ENT_QUOTES,'UTF-8'));
    $filecat = '../books/'.$book.'/'.$book.'.txt';
    $catlist = file($filecat, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);

    $mysqli = new mysqli($Hostname, $Username, $Password, $DatabaseName);
    $stmt = $mysqli->stmt_init();

    $query = "SELECT * FROM PapierTable WHERE book = ? ORDER BY position ASC, title ASC;";
    $prepared = $stmt->prepare($query);

    if($prepared)
    {
        $stmt->bind_param('s', $book);
        $stmt->execute();
        $result = $stmt->bind_result($iden, $title, $price, $image, $description, $category, $enrat, $rating);
        if($result)
        {
            $rit = array();
            while($stmt->fetch())
            {
                $rit[] = array(
                    invert_str(html_entity_decode($title, ENT_QUOTES, 'UTF-8')),
                    $price,
                    invert_str(html_entity_decode($image, ENT_QUOTES, 'UTF-8')),
                    invert_str(html_entity_decode($description, ENT_QUOTES, 'UTF-8')),
                    invert_str(html_entity_decode($category, ENT_QUOTES, 'UTF-8')),
                    $enrat,
                    $rating
                );
            }
            $stmt->close();
            $count = count($catlist);
            $ret = array();
            for($i = 0; $i < $count ; $i++)
            {
                $ret[] = array_merge($ret, search($rit, 4, $catlist[$i]))
            }
            echo json_encode($ret);
        }
        else
        {
            file_put_contents('binderror.txt', $stmt->error);
        }
    }
    else
    {
        file_put_contents('connecterror.txt',$stmt->error);
    }
}
?>

それで問題が解決するかどうかはわかりませんが、解決しなかった場合は、少なくとも、何が問題なのかを見つけるのがはるかに簡単になるはずです。

発生するエラーのほとんどは非常に一般的で基本的なものですが、構造化されていないコードでは見つけるのが大変です。

于 2013-03-27T16:37:37.237 に答える