2

次のスクリプトは、必要なデータを含む txt ファイルを生成しますが、テキスト ファイルにデータを 2 回生成します。

 mysql_connect($hostname_MySQLCon, $username_MySQLCon, "") or die(mysql_error()); 
 mysql_select_db($database_MySQLCon) or die(mysql_error()); 
 $data = mysql_query("
    SELECT sales_flat_order.increment_id, sales_flat_order.gift_message_id, sales_flat_order.status, gift_message.gift_message_id, gift_message.message
    FROM sales_flat_order
    JOIN gift_message ON sales_flat_order.gift_message_id = gift_message.gift_message_id
    WHERE sales_flat_order.gift_message_id IS NOT NULL
    GROUP BY sales_flat_order.increment_id
    /* AND sales_flat_order.status = 'pending' */;") 
 or die(mysql_error());  
 while($result = mysql_fetch_array( $data )) 
 { 
    $dataRow[] = implode("|", $result);
 } 
$theFile = 'orders-meta.txt';
if (!$handle = fopen($theFile, 'a')) {
    exit;}
if (fwrite($handle, implode("\r\n", $dataRow)) === FALSE) {
    echo "Cannot write to file ($theFile)";
exit;}
echo "Success, the file was written.";
fclose($handle);

txt ファイルの出力例:

100000001|100000001|1121|1121|pending|pending|1121|gift message|gift message
100000002|100000002|1123|1123|pending|pending|1123|Gift message|Gift message

なぜ各値を2回生成するのでしょうか? 出力が次のようになるように変更するにはどうすればよいですか。

100000001|1121|pending|1121|gift message
100000002|1123|pending|1123|Gift message

どんな助けにも本当に感謝します。

ありがとう

4

4 に答える 4

3

mysql_fetch_array()の代わりに使用しているためですmysql_fetch_row()

のデフォルト$result_typeは次のとおりmysql_fetch_arrayです。MYSQL_BOTH

配列 mysql_fetch_array ( resource $result [, int $result_type = MYSQL_BOTH ] )

次のような配列が生成されます。

array(
    0 => 100000001
    'increment_id' => 100000001,
    1 => 1121,
    'gift_message_id' => 1121,
    2 => 'pending',
    'status' => 'pending',
    3 => 1121,
    4 => 'gift message',
    'message' => 'gift message'
)

そして、なぜそれほど効果のない方法でデータを保存しているのですか? すべきでない理由:

$theFile = 'orders-meta.txt';
if (!$handle = fopen($theFile, 'a')) {
    exit;
}

while($result = mysql_fetch_array( $data )) { 
    fwrite($handle, implode("|", $result));
    fwrite($handle, "\n\r");
} 

fclose($handle);
于 2012-10-04T11:05:56.020 に答える
1

デフォルトでmysql_fetch_arrayは、数値キーと連想キーの両方を含む混合配列を返すため、各値が複製されます。フェッチ行を次のように変更します。

mysql_fetch_array($data, MYSQL_ASSOC)
于 2012-10-04T11:05:52.933 に答える
1

ドキュメントから:

フェッチされた行に対応する文字列の配列を返します。それ以上行がない場合は FALSE を返します。返される配列の型は、result_type の定義方法によって異なります。MYSQL_BOTH (デフォルト) を使用すると、連想インデックスと数値インデックスの両方を持つ配列が得られます。MYSQL_ASSOC を使用すると、連想インデックスのみが取得され (mysql_fetch_assoc() が機能するため)、MYSQL_NUM を使用すると、数値インデックスのみが取得されます (mysql_fetch_row() が機能するため)。

mysql_fetch_array各結果を 2 回フェッチします。1 回は連想配列として、もう 1 回はデフォルトで数値インデックス付き配列として取得します。そのため、行が重複します。

そうは言っても、非推奨プロセスであるため使用しないでください。mysql_*ドキュメント ページの読み取りボックスを読み、 または へのリンク、またはPDOここここのリンクをクリックしてください。mysqli_*

于 2012-10-04T11:07:56.483 に答える
0

マニュアルを読む:

mysql_fetch_array (リソース $result [, int $result_type = MYSQL_BOTH] )

次に試してください:

while($result = mysql_fetch_array( $data, MYSQL_NUM )) 
于 2012-10-04T11:05:40.507 に答える