1

私が今日ここにいるのは、解決できないように見える小さな問題に直面しているためです。問題は、$_GET 変数から複数の ID を取得して出力しようとしていることです。私は配列を使用しようとしましたが、うまくいきますが、それは [0] で別々の配列を作成し、配列() 配列() ではなく同じ配列内の 1 つにする必要があります。

したがって、データベースから結果を取得するために mysql_fetch_array で while() を使用しています。正しい ID を取得するには、URL からの $_GET に依存します。したがって、私が api.php?do=remove&id=1,4,7 に渡す URL では、最初の ID のみが出力され、他の ID は名前として出力されません。私が言ったように、私はarray()で試しましたが、これが出てきました:

Array
(
    [0] => BzlXO.jpg
)
Array
(
    [0] => cHZTk.jpg
)
Array
(
    [0] => 9yset.jpg
)
Array
(
    [0] => Ss04V.jpg
)

のように1つの配列にする必要があるため、なぜそれを行うのかわかりません

Array (

   [0] => BzlXO.jpg,
   [1] => cHZTk.jpg,
   [2] => 9yset.jpg,
   [3] => Ss04V.jpg
)

そのようにして、それらを内破すると、次のようにテキストとして表示されます。

        $iName[imagename] = array($iName[imagename]);
        $name = implode(",", $iName[imagename]);

これが私のコードです:

これは、「api.php?do=remove&id=1,4,7」という URL です。

      $ID = $_GET['id'];
    $query = "SELECT ID,imagename FROM uploads WHERE ID IN ({$ID}) AND username = '{$uploader}'";
    $result = mysql_query($query);

      while( $iName = mysql_fetch_array($result)){
          $querys = "DELETE FROM uploads WHERE ID IN ({$ID}) AND username = '{$uploader}'";
      $results = mysql_query($querys);

          if(!$results) {
       $api_message = 'Failed to get a Removal result';
       } else {

            $iName[imagename] = array($iName[imagename]);
            $name = implode(",", $iName[imagename]);

           $api_message = "You removed image(s) $name"; 

          }
}

出力 :

画像を削除しました BzlXO.jpg

しかし、私はそれが必要です:

OUTPUT : 画像 "BzlXO.jpg,cHZTk.jpg,9yset.jpg,Ss04V.jpg" を削除しました

これに関するヘルプは大歓迎です。さらに情報が必要な場合はお知らせください。ありがとうございます。

4

3 に答える 3

2

おそらく、次のように、ループの前に宣言された配列を埋める必要があります。

$images = array();
while( $iName = mysql_fetch_array($result)) { 
  ...
  $images[] = $iName['imagename']; # pushing the deleted image into that array
}
...
$names = implode(', ', $images);

そして、少なくとも代わりにmysqli関数セットを使用する可能性を確認することを強くお勧めします(またはPDO、私の意見ではさらに優れていますが、コードベースには大きすぎるステップかもしれません)。)。

于 2012-07-06T23:46:44.480 に答える
2

raina77ow によって投稿されたソリューションに加えて、ループDELETE FROM uploads WHERE ID IN (...)の反復ごとにステートメントを実行しているという点で、制御フローにも問題があります。whileこれにより、最初の反復ですべてのレコードが削除されます。次のように変更する必要があります。

$ID = $_GET['id'];
$names = array();
$query = "SELECT ID,imagename FROM uploads WHERE ID IN ({$ID}) AND username = '{$uploader}'";
$result = mysql_query($query);

  while( $iName = mysql_fetch_array($result)){
      $querys = "DELETE FROM uploads WHERE ID = {$iName['ID']} AND username = '{$uploader}'";
      $results = mysql_query($querys);
      if(!$results) {
       $api_message = 'Failed to get a Removal result';
      } else {
        $names[] = $iName['imagename']);
      }
  }
  $name = implode(",", $names);
  $api_message = "You removed image(s) $name"; 
于 2012-07-07T00:00:34.097 に答える
1

無効な値から保護し、失敗の可能性を減らすために、コードを修正する必要があります。

特定の問題に関しては、ある配列の値を別の配列内に配置する必要はありません。それを文字列に内破するという目的のためだけです。文字列連結を使用して、必要な値を追加し続けることができます。

この提案は問題を修正します: コード コメントは何が起こっているかを説明するためのものです

// initialize the user message with the success string
$api_message = "You removed image(s): ";

// check if the URL variable exists and contains values
if (isset($_GET['id']) && $_GET['id']!='') {

    // clean the values a litle bit to prevent code injection
    $ID = strip_tags(trim($_GET['id']));

    // prepare the query (more compatible string concatenation)
    $query = "SELECT ID, imagename FROM uploads WHERE ID IN (".$ID.") AND username = '".$uploader."'";

    // query the databse
    $result = mysql_query($query);

    // check for results
    if (is_resource($result) && mysql_num_rows($result)>=1) {

        // get total records
        $counter = mysql_num_rows($result);

        // run by each result found
        while($iName = mysql_fetch_array($result)) {

            // delete all from the database
            $querys = "DELETE FROM uploads WHERE ID IN (".$ID.") AND username = '".$uploader."'";
            $results = mysql_query($querys);

            // check if the returned result is false
            if (!$results) {

                // replace the user message with a fail information
                $api_message = 'Failed to get a Removal result';

            } else {

                // decrease the counter
                $counter--;

                // update the user message and add a "," if this is not the last name
                $api_message.= $iName['imagename'] . (($counter==0)?(''):(', '));

            }
        }

    } else {
        $api_message = 'ups... failed to talk with the database';
    }

} else {
    $api_message = 'ups... no ids collected';
}

関連読書:

  • PHP ストリップタグ

    strip_tags — 文字列から HTML および PHP タグを取り除く

  • PHP トリム

    トリム — 文字列の先頭と末尾から空白 (またはその他の文字) を削除します

  • PHP is_resource

    is_resource — 変数がリソースかどうかを調べる

于 2012-07-07T00:15:44.017 に答える