2017-03-08 8 views
2

mysqlを持つ古いPHPコードがあります。PHP mysqli_fetch_assocが正しい値を返さない

SELECTステートメントから配列を取得し、それをプロパティとしてJSONオブジェクトに追加し、エンコードされたJSONをエコーし​​ます。

mysqliを使うために変更しましたが、行を取得しようとしたときに配列を作成しようとすると、何も返されません。

$con = mysql_connect('host','account','password'); 
if (!$con) 
{ 
    //log my error 
}; 

mysql_select_db("database_name", $con); 
mysql_set_charset('utf8'); 
$sql = "SELECT field1 as Field1, field2 as Field2 from table where ID = '".$parameter."'"; 
$query = mysql_query($sql); 
$results = array(); 
while($row = mysql_fetch_assoc($query)) 
{ 
    $results[] = $row; 
} 
return $results; 

バージョン1:

$con = mysqli_connect('host','account','password','database_name'); 
$sql = "SELECT field1 as Field1, field2 as Field2 from table where ID = '".$parameter."'"; 
$results = array(); 
if($result=mysqli_query($con, $sql)) 
{ 
    while ($row=mysqli_fetch_assoc($result)) 
    { 
     $results[] = $row; 
    } 
    return $results; 
} 
else 
{ 
    //error 
} 

バージョン2:ここで私は書き込みをしようとした新しいものだ、私が試した二つ目、1行のみを返します。

ここで、古いMySQLのコードです

バージョン3:または私はこのようなmysql構造を完全にミラーリングしようとしました:

JSONへの結果の配列をラップ
$sql = "SELECT ..."; 
$query = mysqli_query($con, $sql); 
$results = array(); 
while($row = mysqli_fetch_assoc($query)) 
{ 
    $results[] = $row; 
} 
return $results; 

:mysqliのバージョンの

$obj = new stdClass(); 
$obj->Data = $results; 
$obj->ErrorMessage = ''; 
die(json_encode($obj)); //or echo json_encode($obj); 

どれも機能していないので、私はこれらの配列が作成されている方法で、重要な変更がある場合があります考えていました。

最初のmysqliの例で何が間違っているかに関するヒントを教えてください。

バージョン2では、SQL接続が存在し、少なくとも行を選択できることがわかります。しかし、明らかにそれが返すよりも1行だけです。それは私が配列を構築することは、問題の原因であることを、と思わせる、またはそれは...

LATER EDIT JSONオブジェクトに関するだ: OK!実用的な解決策を見つけました。

また、私はデータで周りを回って、小さなチャンクを選んで突然動いた。これからの教訓:関数は40行または5行に対して同じように応答していません。それはphp.iniの設定と関係がありますか?あるいは、選択に不正な文字がある可能性がありますか? 'Note'列の長さ(DBから)が長すぎて配列が処理できないことがありますか?

データベースからいくつかの行を選択して配列に配置し、その配列を最後にJSONにエンコードされたオブジェクトに配置し、隣にステータスメッセージを付けます。改善することができますが、これはデモ用です。

$con = mysqli_connect('host','username','password','database_name'); 
if (!$con) 
{ 
    $errorMessage = 'SQL connection error: '.$con->connect_error; 
    //log or do whatever. 
}; 
$sql = "SELECT Field1 as FieldA, field2 as FieldB, ... from Table where ID='something'"; 

$results = array(); 

if($result = mysqli_query($con, $sql)) 
{ 
    while($row = mysqli_fetch_assoc($result)) 
    { 
     $results[] = $row; 
    } 
} 
else 
{ 
    //log if it failed for some reason 
    die(); 
} 

$obj->Data = $results; 
$obj->Error = ''; 
die(json_encode($obj)); 

質問です:どのように私は(そのような場合)、配列のサイズに関する問題/不正な文字を克服することができますか?

+0

:あなたのコードでは、プリペアドステートメントを使用して、このように見えるでしょうか?正しく接続されていますか?あなたのSELECTクエリは何ですか、あなたはそれが動作していることを知っていますか? – Qirel

+0

こんにちは! $ conは接続ハンドラであり、この点に達すると動作します。私はそれを印刷しようとし、それをMYSQLのワークベンチに貼り付けるので、SELECTも機能します。 – Laureant

+0

mysqli_error()はどこにありますか?あなたは何を得ているのですか? – user3526204

答えて

1

"バージョン1"は、PHPの観点からは正しいようですが、接続時とクエリ実行時の両方でエラーを実際に処理する必要があります。そうすることで、実際にテーブルをクエリしていないとクエリにはFROM tablenameが不足しているというメッセージが表示されます。

接続時にmysqli_connect_error()を使用し、実際のエラーを取得するためにクエリするとmysqli_error($con)を使用してください。PHPの一般的なエラー報告も役に立ちます。

以下のコードは、このコードの前に$parameterが定義されていることを前提としています。

$con = mysqli_connect('host','account','password','database_name'); 
if (mysqli_connect_errno()) 
    die("An error occurred while connecting: ".mysqli_connect_error()); 

$sql = "SELECT field1 as Field1, field2 as Field2 
     FROM table 
     WHERE ID = '".$parameter."'"; 

$results = array(); 
if ($result = mysqli_query($con, $sql)) { 
    while ($row = mysqli_fetch_assoc($result)) { 
     $results[] = $row; 
    } 
    return $results; 
} else { 
    return mysqli_error($con); 
} 

エラー-reporing

PHPのエラーを取得することができますでしょう<?php後に直接、あなたのファイルの先頭に

error_reporting(E_ALL); 
ini_set("display_errors", 1); 

を追加します。

:それは他の人によって悪用される可能性があるとして、エラーが、ライブ環境で表示されませありません。開発中は便利でトラブルシューティングが楽になりますが、それ以外の場合は表示しないでください。

セキュリティ

また、このコードはSQLインジェクションに対して脆弱であり、あなたがその身を守るためにプレースホルダをパラメータ化クエリを使用する必要があることに注意すべきです。

$con = mysqli_connect('host','account','password','database_name'); 
if (mysqli_connect_errno()) 
    die("An error occurred while connecting: ".mysqli_connect_error()) 

$results = array(); 

if ($stmt = mysqli_prepare("SELECT field1 as Field1, field2 as Field2 
          FROM table 
          WHERE ID = ?")) { 
    if (mysqli_stmt_bind_param($stmt, "s", $parameter)) { 
     /* "s" indicates that the first placeholder and $parameter is a string */ 
     /* If it's an integer, use "i" instead */ 
     if (mysqli_stmt_execute($stmt)) { 
      if (mysqli_stmt_bind_result($stmt, $field1, $field2) { 
       while (mysqli_stmt_fetch($stmt)) { 
        /* Use $field1 and $field2 here */ 
       } 
       /* Done getting the data, you can now return */ 
       return true; 
      } else { 
       error_log("bind_result failed: ".mysqli_stmt_error($stmt)); 
       return false; 
      } 
     } else { 
      error_log("execute failed: ".mysqli_stmt_error($stmt)); 
      return false; 
     } 
    } else { 
     error_log("bind_param failed: ".mysqli_stmt_error($stmt)); 
     return false; 
    } 
} else { 
    error_log("prepare failed: ".mysqli_stmt_error($stmt)); 
    return false; 
} 

参照あなたは `$のcon`を定義しない

関連する問題