0

私は私を狂わせ、誰かが助けてくれることを望んでいる問題を抱えています。私は最近、古い方法ではなくmysqlPDOの学習を開始しました。値を配列に取り込み、ループで処理するフォームをまとめました。私が何をしているのかを示すために以下に簡略化しましたが、問題はローカルマシンで正常に動作することですが、ライブでロードされると、forループ中にmysql接続が失われると思います。

フォームは次のとおりです。

<form method="post" action="next.php">
  <table border="1" cellspacing="2" cellpadding="3" style="font-size: 11px; font-family: arial;">
    <tr>
      <td><input type="checkbox" onClick="toggle(this)" /><br/></td>
      <td><b>Sub Service Code</b></td>
      <td><b>Criteria Value</b></td>
      <td><b>Criteria Value 2</b></td>
    </tr>
    <tr>
      <td><input type="checkbox" name="ID[]" value="2" /></td>
      <td>&nbsp;John</td>
      <td>&nbsp;</td>
      <td>&nbsp;</td>
    </tr>
    <tr>
      <td><input type="checkbox" name="ID[]" value="3" /></td>
      <td>&nbsp;Paul</td>
      <td>&nbsp;</td>
      <td>&nbsp;</td>
    </tr>
    <tr>
      <td><input type="checkbox" name="ID[]" value="4"checked /></td>
      <td>&nbsp;Mary</td>
      <td>&nbsp;</td>
      <td>&nbsp;</td>
    </tr>   
  </table>
  <input type="submit" value="Submit" name="next">
</form>

このフォームを処理するために使用しているphpスクリプトは次のようになります。

<?php
if (isset($_POST['next'])) {
?>
<form method="post" action="next-2.php">
<table border="1" cellspacing="2" cellpadding="3" style="font-size: 11px; font-family: arial;">
<tr>
<td><input type="checkbox" onClick="toggle(this)" /><br/></td>
<td><b>Name</b></td>
<td><b>Value</b></td>
<td><b>Value 2</b></td>
<td><b>Select # of Levels</b></td>
</tr>

<?php
  $id = $_POST['ID'];
  if (empty($id)) {
    echo("<p>You didn't select any names.</p>");
  } else {
    $N = count($id);
    echo("<p>You selected $N names(s):</p>");
    for($i=0; $i < $N; $i++) {
      //echo($id[$i] . " ");
      $stmt = $db->query('SELECT * FROM services_main');
      while($row = $stmt->fetch(PDO::FETCH_ASSOC)) {

        if ($row['ID'] == $id[$i]) {

        echo '
<tr>
  <td><input type="checkbox" name="ID[]" value="'.$row['ID'].'" checked /></td>
  <td>&nbsp;'.$row['Name'].'</td>
  <td>&nbsp;'.$row['Value'].'</td>
  <td>&nbsp;'.$row['Value 2'].'</td>
  <td>
    <select name="rate_'.$row['ID'].'" >
      <option value="1">1</option>
      <option value="2">2</option>
      <option value="3">3</option>
      <option value="4">4</option>
      <option value="5">5</option>
    </select>                       
  </td>
</tr>';
        }
      }
    }
  }
}
?>
</table>
<input type="submit" value="Submit" name="next-2">
</form>

非ローカル環境では、私はこれを取得しています:

<form method="post" action="next-2.php">
  <table border="1" cellspacing="2" cellpadding="3" style="font-size: 11px; font-family: arial;">
    <tr>
      <td><input type="checkbox" onClick="toggle(this)" /><br/></td>
      <td><b>Name</b></td>
      <td><b>Value</b></td>
      <td><b>Value 2</b></td>
      <td><b>Select # of Levels</b></td>
    </tr>
    <p>You selected 3 names(s):</p>
    <tr>
        <td><input type="checkbox" name="ID[]" value="2" checked /></td>
        <td>&nbsp;John</td>
        <td>&nbsp;</td>
        <td>&nbsp;</td>
        <td>
            <select name="rate_2" >
                <option value="1">1</option>
                <option value="2">2</option>
                <option value="3">3</option>
                <option value="4">4</option>
                <option value="5">5</option>
            </select>                       
        </td>
    </tr>
  </table>
  <input type="submit" value="Submit" name="next-2">
</form>

db接続が失われる可能性があると思う理由は、「$ N名を選択しました」と設定し、Nの値が3と正しく表示されているためです。つまり、dbを毎回クエリするたびに3回ループする必要があります。各名前の3つのID値の。繰り返しますが、ローカル環境では完全に正常に機能しますが、ライブサーバーでは機能しません。ライブ環境で他の2つではなく、ファーストネームの結果(John)のみが返される理由がわかりません。

最後に、私の各ページに次のデータベース接続ファイルを含めています

$db = new PDO('mysql:host=sitename.org;dbname=name;charset=UTF-8', 'user', 'pwd');

私はこの質問を十分に説明したことを望みます、そしてそれはおそらく私がどういうわけか見落としている単純なものだと思います。ご覧いただきありがとうございます...

4

1 に答える 1

3

まず、必要な結果を見つけるために1つのレコードを比較する必要はありませんWHERE。結果を調整するには、MySQLを使用するだけです。<p>他の問題は構造に関するもので、要素をに追加することはできません<table>

だから、私がやっていることはチェックが$_POST['ID']設定されていることです、そしてチェックはこの変数が配列であることです。次に、のすべての値をエスケープし$_POST['ID']、その後、配列をSQLに内破しました。

注:SQLでは、コードが要求したフィールドのみを選択しました。

したがって、このコードは機能するはずです。

<?php
if (isset($_POST['next'])) {
?>
<form method="post" action="next-2.php">
<table border="1" cellspacing="2" cellpadding="3" style="font-size: 11px; font-family: arial;">
<tr>
<td><input type="checkbox" onClick="toggle(this)" /><br/></td>
<td><b>Name</b></td>
<td><b>Value</b></td>
<td><b>Value 2</b></td>
<td><b>Select # of Levels</b></td>
</tr>

<?php
  // Check the existence of the "$_POST['ID']" and check if this is a array
  if (isset($_POST['ID']) && is_array($_POST['ID']) {
    $id = $_POST['ID'];
    // Here we can't add '<p>' element to the table, so I used '<tr>'
    echo '<tr><td colspan="5">You selected ' . count($id) . 'names(s):</td></tr>';

    // Create a function to escape the value.
    function escape($value) {
      // Only integer value can be returned.
      return (int) $value;
    }

    // Escaping '$id' values.
    $id = array_map('escape', $id);

    // SQL, here we implode all value to the condition.
    $stmt = $db->query('SELECT `ID`, `Name`, `Value`, `Value 2` FROM `services_main` WHERE `ID` IN (' . implode(',', $id) . ')');

    // Loop all results
    while($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
      echo '
<tr>
  <td><input type="checkbox" name="ID[]" value="' . $row['ID'] . '" checked /></td>
  <td>&nbsp;' . $row['Name'] . '</td>
  <td>&nbsp;' . $row['Value'] . '</td>
  <td>&nbsp;' . $row['Value 2'] . '</td>
  <td>
    <select name="rate_' . $row['ID'] . '" >
      <option value="1">1</option>
      <option value="2">2</option>
      <option value="3">3</option>
      <option value="4">4</option>
      <option value="5">5</option>
    </select>                       
  </td>
</tr>';
    }

    unset($stmt, $id);
  } else {
    // Here we can't add '<p>' element to the table, so I used '<tr>'
    echo '<tr><td colspan="5">You didn\'t select any names.</td></tr>';
  }
}
?>
</table>
<input type="submit" value="Submit" name="next-2">
</form>
于 2012-06-25T19:02:52.730 に答える