Ошибка в моей кодировке, но не знаете, как ее исправить, интересно, кто-нибудь может помочь? - PullRequest
1 голос
/ 02 апреля 2012

Привет, я столкнулся с проблемой с функцией foreach в php ... я использовал функцию для ввода результатов массива в базу данных.Например, если Array (3,5,7), система должна ввести 3 разных записи в базу данных.Однако, в моем случае, он создал только 1 запись и полностью проигнорировал остальные 2. Могу ли я узнать, сможет ли кто-нибудь определить мою ошибку?

Я создал форму с флажками и пытался получить значение и дать каждомунапример, значение отдельного массива:

<form name="appoptions" id="applicationoptions" method="post" action="s_apply_now.php">
<table width="100%" class="apptable" border="0" cellspacing="0" cellpadding="0">
  <tr>
    <td><input type="checkbox" name="cat[]" value="1" /> CAT 2PG</td>
    <td><input type="checkbox" name="cat[]" value="2" /> CAT 1OR</td>
    <td><input type="checkbox" name="cat[]" value="3" /> CAT 2TT</td>
  </tr>
  <tr>
    <td><input type="checkbox" name="cat[]" value="4" /> CAT 3PG </td>
    <td><input type="checkbox" name="cat[]" value="5" /> CAT 2OR</td>
    <td><input type="checkbox" name="cat[]" value="6" /> CAT 3TT</td>
  </tr>
  <tr>
    <td><input type="checkbox" name="cat[]" value="7" /> CAT 4PG</td>
    <td><input type="checkbox" name="cat[]" value="8" /> CAT 3OR</td>
    <td>&nbsp;</td>
  </tr>
</table>
</form>

После нажатия на кнопку подтверждения он перейдет на страницу процессора.На своей странице процессора я попытался извлечь значение, но я понял, что оно в массиве:

<?php
session_start();
include'Connections/database.php';
$conn = dbConnect ();
    if (! $conn)
    die("Couldn't connect to MySQL");
    $user = $_SESSION['eid'];
    $query = "select MED  from emp where EID = '$user'";
    $result = mysql_query($query, $conn);
    $row = mysql_fetch_assoc($result);

$med = $row['MED']; 
$user =$_SESSION['eid'];
$class=$_POST['class'];
$cat_arr=$_POST['cat'];


$i = 0; /* for illustrative purposes only */

foreach ($cat_arr as $cat) 
{
    if ($med=='no')
    {

        if (! $conn)
        die("Couldn't connect to My SQL");

        $query = "insert into permit (EID, PTYPE, STATUS) values ('$user,$cat, 'medical')";
        $result = mysql_query($query,$conn);
        header ('Location:medical_question.php');
        $i++;
    }
    else
    {

        if (! $conn)
        die("Couldn't connect to My SQL");
        $query = "insert into permit (EID, PTYPE) values ('$user,$cat)";
        $result = mysql_query($query,$conn);
        $i++;
    }
 }
dbDisconnect($conn);
 ?>

Я не уверен, если для каждого это ошибка, но я думаю, что это где-то там ...

Заранее спасибо.

Ответы [ 3 ]

5 голосов
/ 02 апреля 2012

Я вижу несколько разных вещей с вашим PHP-кодом:

  1. Вы не должны подключать / отключать MySQL в вашем цикле.Это ненужные накладные расходы.Вместо этого подключайтесь перед циклом и затем отключайте.
  2. Вам необходимо очистить любой пользовательский ввод, прежде чем использовать его в запросе.Ваш код уязвим для SQL-инъекций .
  3. Вы также должны переместить свою строку header('Location:medical_question.php'); за пределы цикла и изменить ее на die(header('Location:medical_question.php'));, чтобы остановить остальную частьваш сценарий от выполнения (при условии, что это то, что вы хотите, чтобы это произошло).
  4. Вам необходимо исправить одинарные кавычки в ваших запросах:

    insert into permit (EID, PTYPE, STATUS) values ('$user,$cat, 'medical')

    должно быть:

    insert into permit (EID, PTYPE, STATUS) values ('$user', '$cat', 'medical')

    И то же самое для вашего другого запроса.

В конце ваш сценарий будет выглядеть более похожим наэто:

$conn = dbConnect();
if (!$conn)
    die("Couldn't connect to MySQL");

$user = mysql_real_escape_string($_SESSION['eid']);
$class = $_POST['class'];
$cat_arr = $_POST['cat'];

foreach ($cat_arr as $cat) 
{
    $cat = mysql_real_escape_string($cat);

    if ($med == 'no')
        $query = "INSERT INTO permit (EID, PTYPE, STATUS) VALUES ('{$user}', '{$cat}', 'medical')";
    else
        $query = "INSERT INTO permit (EID, PTYPE) VALUES ('{$user}', '{$cat}')";

    mysql_query($query);
}

dbDisconnect($conn);

if ($med == 'no')
    $nextPage = "medical_question.php";
else
    $nextPage = "next_page.php";

die(header("Location:{$nextPage}"));

Пример SQL-инъекции:

Предположим, ваш запрос выглядит следующим образом:

$user = $_GET["user"];
$cat = $_GET["cat"];
$query = "insert into permit (EID, PTYPE, STATUS) values ('$user', '$cat', 'medical')";

Как бы выглядел ваш запрос, если бы я передал значение, подобное этому дляuser:

`'); DROP TABLE permit; /*`

Это превратит ваш запрос в следующее:

insert into permit (EID, PTYPE, STATUS) values (''); DROP TABLE permit; /*', 'cat', 'medical')

Это определенно , а не то, что вы хотели.Когда вы дезинфицируете ввод с помощью mysql_real_escape_string, он будет экранирован символом одинарных кавычек, и либо запрос не будет выполнен, либо вместо выполнения будет вставлена ​​вся строка.

ОБНОВЛЕНИЕ:

Причину, по которой вы хотите переместить header за пределы цикла, будет легче понять, если вы точно знаете, что делает функция:

Когда вывызовите функцию PHP header, вы говорите PHP (на стороне сервера) отправить HTTP-заголовок в браузер (на стороне клиента).В случае header('Location:...') вы отправляете заголовок HTTP, который заставляет браузер перенаправить на другую страницу и отключиться от текущего сценария PHP.

Итак, таков ход событий:

  1. Скрипт PHP отправляет заголовок HTTP, и в зависимости от задержки браузеру может потребоваться некоторое время для его получения.
  2. Браузер интерпретирует заголовок и перенаправляет в местоположение, которое выуказанный, который также отправляет сообщение о разъединении в текущий исполняемый скрипт PHP.
  3. Опять же, в зависимости от задержки, серверу может потребоваться некоторое время для получения сообщения о разъединении из браузера.

Между тем, когда скрипт PHP отправляет заголовок, а затем получает сообщение о разъединении, скрипт все еще выполняется.Невозможно определить, сколько кода выполнит сценарий до получения сообщения о разъединении, поэтому вы вообще не можете на это полагаться.Вот почему вы должны die при отправке заголовка.

Зная, что именно так работает функция PHP header, единственная причина, по которой вы, возможно, захотите поместить это в цикл, это если вы хотитетекущий скрипт, чтобы остановить выполнение в середине цикла в зависимости от некоторых определенных условий.Например:

foreach ($vars as $var)
{
    if ($var == "stop")
        die(header("Location:anotherPage.php"));

    // do something as long as $var != "stop"
}

Это будет циклически проходить по массиву $var, пока не достигнет значения "stop", после чего он отправит заголовок перенаправления клиенту и остановит выполнение.

Разница с вашим примером в том, что (до того, как вы его отредактировали) ваш цикл содержал один оператор if-else, и в обоих if и в else у вас был вызов перенаправления заголовка.Поэтому, несмотря ни на что, оно будет отправлено на первой итерации цикла, что не имеет смысла.Если это действительно то, что вы хотели, вы бы не использовали цикл.Это будет выполнено только один раз, что противоречит цели цикла.

Приносим извинения за скучный ответ, но, надеюсь, теперь вы лучше понимаете, что на самом деле происходит в вашем коде.

2 голосов
/ 02 апреля 2012

Вставка выполняется только один раз, потому что после первой вставки вы перенаправляете на medical_question.php.

Переместите этот перенаправление за пределы foreach:

header ('Location:medical_question.php');

Также вы можететакже передвиньте базу данных до foreach тоже.

1 голос
/ 02 апреля 2012
  1. строки помечены '$ string' (апостроф) в sql запросе

    $ query = "вставить в значения разрешения (EID, PTYPE) ('$ user', '$ cat ') ";

  2. Вы можете инициализировать только один объект БД ($ db) с правильным подключением и использовать его там, где хотите: см. http://php.net/manuel/en/ref.mysql.php

Например:

    $conn = new mysqli('localhost', 'root', 'pass', 'db');
    if (mysqli_connect_errno()) {
        exit('Connect failed: '. mysqli_connect_error());
    }
    $sql = "INSERT INTO `table` (`id`, `val`) VALUES (1, 'peace'), (2, 'love')";
    if ($conn->query($sql) === TRUE) {
        echo 'Done';
    }
    else {
        echo 'Error: '. $conn->error;
   }
   $conn->close();

Это просто пример.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...