Цикл по массиву $ _POST не работает - PullRequest
0 голосов
/ 13 июня 2011

У меня есть функция php, которая должна проходить через массив данных $ _POST, содержащих идентификаторы записей, но я не могу понять, почему она не работает.У меня есть аналогичные функциональные возможности в другом месте на моем сайте, но этот конкретный хочет быть трудным:

if (isset($_POST['classNumberAdd']) && isset($_POST['classNameAdd'])) {
    $classNumber = $_POST['classNumberAdd'];
    $className = $_POST['classNameAdd'];

    $sqlAddClass = "INSERT INTO classes (className, classNumber) VALUES ('" . $className . "', '" . $classNumber . "')";

    include('../includes/dbConnect.php');

    $addClassResult = @mysqli_query($dbc, $sqlAddClass);

    // Get the id of the class just inserted            
    $sqlGetClassID = "SELECT classID FROM classes WHERE className = '" . $className . "' AND classNumber = '" . $classNumber . "'";
    $getClassIdResult = @mysqli_query($dbc, $sqlGetClassID);
    $classID = 0;

    while ($row = mysqli_fetch_row($getClassIdResult)) {$classID = $row[0];}

    $log->lwrite('Before check if array set: docsToAddToClass array: ' . $_POST['docsToAddToClass']);

    // Add any checked docs to the new class
    if (isset($_POST['docsToAddToClass'])) {

        $log->lwrite('After check if array set and before addDocs function call: docsToAddToClass array: ' . $_POST['docsToAddToClass']);

        foreach($_POST['docsToAddToClass'] as $docID) {
            $log->lwrite('Doc id being added to new class: ' . $docID);
            // Add each class to the document
            $sqlAddClassToDoc = "INSERT INTO classDocs (classDocsClassID, classDocsDocID) VALUES ('" . $classID . "', '" . $docID . "')";

            $resultAddDocToClass = @mysqli_query($dbc, $sqlAddClassToDoc);
        }
    }

    mysqli_close($dbc);
    echo $classID;
}

Как вы можете видеть, у меня есть несколько строк, которые регистрируют, где я нахожусь.Я никогда не получаю строку "$log->lwrite('Doc id being added to new class: ' . $docID);", поэтому по какой-то причине я не получаю в массиве.Последняя строка, которую нужно записать в журнал при любом проходе, - это строка «После проверки, если массив установлен ...».

Первоначально вместо цикла foreach я передавал POST и идентификатор класса вфункция (определенная как function addDocsToClass($docsArray, $classID), но это не сработало, поэтому я переместил все это в код, как описано выше, для устранения неполадок.

Я попытался сначала установить для переменной $ _POST переменную (например, $docsArray = $_POST['docsToAddToClass'])), но ничего из того, что я пробовал, пока не работает.

Что я пропускаю / делаю неправильно?

[ПРАВИТЬ] Новая информация, основанная на более внимательном рассмотрении моегоcode:

Я вызываю вышеуказанный php-скрипт в вызове $ .ajax (), который передает docsToAddToClass в виде списка разделенных запятыми идентификаторов, полученных и построенных следующими строками:

$.each($('#docsTable input[name="docsToAddToClass[]"]:checked'), function() {
    docsToAddToClass.push($(this).val());
});

Как упомянуто в ответе ниже, $ _POST ['docsToAddToClass'] печатается в моем журнале как 35,36,37 и т. Д. В javascript alert () также отображается тот же вывод. Поэтому я решилиспользовать php explode для создания массива для итерации:

$docsArray = explode(',', $_POST['docsToAddToClass']);

Hoоднако, в переменную помещается только первый идентификатор в списке, который в итоге НЕ является массивом, нарушающим сценарий.

Итак, даже после обнаружения всего этого, я в значительной степени вернулся кквадрат один!

Как перебрать список идентификаторов в $ _POST ['docsToAddToClass'], когда он отформатирован как 35,36,37, и получить каждый идентификатор, как если бы $ _POST был обычным phpмассив

Ответы [ 2 ]

0 голосов
/ 14 июня 2011

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

Итак, я выложу рабочий, соответствующий код: Javascript:

var addDocs = 'false';
var docsToAddToClass = new Array();

if ($('input.chkAddDoc:checked').length > 0) {
    addDocs = 'true';

    // Get the ids of the checked docs the user wants to add to the new class
    $.each($('#docsTable input[name="docsToAddToClass[]"]:checked'), function() {
        docsToAddToClass.push($(this).val());
    });
}

alert('docsToAddToClass' + docsToAddToClass);

// Build the string to send as $_POST data
var dataString = 'classNumberAdd=' + classNumberAdd + '&classNameAdd=' + classNameAdd;
if (docsToAddToClass != '') {  dataString += '&docsToAddToClass=' + docsToAddToClass; }

И скрипт php: if (isset ($ _ POST ['classNumberAdd']) && isset ($ _ POST ['classNameAdd'])) { $ classNumber = $ _POST ['classNumberAdd']; $ className = $ _POST ['classNameAdd'];

$sqlAddClass = "INSERT INTO classes (className, classNumber) VALUES ('" . $className . "', '" . $classNumber . "')";

include('../includes/dbConnect.php');

$addClassResult = @mysqli_query($dbc, $sqlAddClass);

// Get the id of the class just inserted            
$sqlGetClassID = "SELECT classID FROM classes WHERE className = '" . $className . "' AND classNumber = '" . $classNumber . "'";
$getClassIdResult = @mysqli_query($dbc, $sqlGetClassID);
$classID = 0;

while ($row = mysqli_fetch_row($getClassIdResult)) {$classID = $row[0];}

// Add any checked docs to the new class
if (isset($_POST['docsToAddToClass'])) {

    $docsArray = explode(',', $_POST['docsToAddToClass']);

    foreach($docsArray as $docID) {

        // Add each class to the document
        $sqlAddClassToDoc = "INSERT INTO classDocs (classDocsClassID, classDocsDocID) VALUES ('" . $classID . "', '" . $docID . "')";

        $resultAddDocToClass = @mysqli_query($dbc, $sqlAddClassToDoc);
    }
}
// Close the database connection
mysqli_close($dbc);

echo $classID;

}

Надеюсь, это кому-нибудь поможет!

0 голосов
/ 13 июня 2011

Подтвердили ли вы, что $ _POST ['docsToAddToClass'] установлен, и что это массив? Если это не массив, foreach () не будет работать.

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