循环通过$ _POST数组不起作用

时间:2011-06-13 15:24:07

标签: php arrays loops post

我有一个php函数,它应该循环包含记录ID的$ _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);”这一行,所以出于某种原因我没有进入阵列。在任何运行中写入日志的最后一行是“After check if array set ...”行。

最初,我将POST和类ID传递给一个函数(定义为function addDocsToClass($docsArray, $classID),而不是foreach循环,但是这不起作用,所以我将整个事情移动到上面的代码中排除故障。

我已经尝试将$ _POST数组首先设置为变量(例如$docsArray = $_POST['docsToAddToClass'])),但到目前为止我还没有尝试过。

我错过了什么/做错了什么?

[编辑] 基于仔细查看我的代码的新信息:

我在$ .ajax()调用中调用上面的php脚本,该调用将docsToAddToClass作为以逗号分隔的id列表传递,这些ID由以下行检索和构建:

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

如下面的回复中所述,$ _POST ['docsToAddToClass']在我的日志中打印出35,36,37等.javascript alert()也显示相同的输出。所以我决定使用php explode构建一个迭代的数组:

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

但是,只有列表中的第一个id被放入变量中,最终不是数组,从而破坏了脚本。

所以,即使在发现了所有这些之后,我也回到了原点!

当格​​式化为35,36,37时,如何遍历$ _POST ['docsToAddToClass']中的id列表,并获取每个id,就像$ _POST是常规php数组一样?

2 个答案:

答案 0 :(得分:0)

您确认已设置$ _POST ['docsToAddToClass'],并且它是一个数组吗?如果它不是数组,则foreach()不起作用。

答案 1 :(得分:0)

好的,经过更多的试验和错误,我得到了它的工作。问题是,从我最初发布的内容和我现在的工作代码来看,我不知道我做对了什么!

所以,我将发布有效的相关代码: 使用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;

}

希望能帮助别人!