【问题标题】:Undefined variable when it's outside while loop - PHP当它在while循环之外时未定义的变量 - PHP
【发布时间】:2017-09-28 03:29:57
【问题描述】:

我想知道为什么我收到错误提示 注意:未定义变量:第 xx 行的 C:\xampp\htdocs\op\ajax\ajaxLanddevNTPPayroll.php 中的 query_add_landdev_temp_payroll 。在过去的 2 周里,它运行良好。当我今天尝试执行代码时,我遇到了这种错误。这是我的代码:

$query_get_payroll = mysqli_query($new_conn, "SELECT ntp_with_ob_payroll_transaction.ntp_id, ntp_with_ob_payroll_transaction.allotment_code, ntp_with_ob_payroll_transaction.category_name, ntp_with_ob_payroll_transaction.block_number, ntp_with_ob_payroll_transaction.activity, ntp_with_ob_payroll_transaction.lot_number, ntp_with_ob_payroll_transaction.labor_cost, other_budget.quantity FROM ntp_with_ob_payroll_transaction JOIN other_budget ON ntp_with_ob_payroll_transaction.ob_id = other_budget.ob_id WHERE other_budget.transaction_id = $transaction_id AND other_budget.ob_number = '$ntp_number' AND is_payroll = 0");

while($row = mysqli_fetch_assoc($query_get_payroll)) {

    $ntp_id = $row['ntp_id'];
    $allotment_code = $row['allotment_code'];
    $category_name = $row['category_name'];
    $block_number = $row['block_number'];
    $activity = $row['activity'];
    $lot_number = $row['lot_number'];
    $labor_cost = $row['labor_cost']; //this is equivalent to unit cost
    $quantity = $row['quantity']; //this is equivalent to total percentage


    $query_add_landdev_temp_payroll = mysqli_query($new_conn, "INSERT INTO temp_payroll_landdev(ntp_id, userid, transaction_id, ntp_number, contractor_name, allotment_code, category_name, block_number, activity, lot_numbers, regular_labor, quantity) VALUES($ntp_id, $_SESSION[userid], $transaction_id, '$ntp_number', '$fullname', '$allotment_code', '$category_name', $block_number, '$activity', '$lot_number', '$labor_cost', '$quantity')");
}

if($query_add_landdev_temp_payroll) {

    echo 1;

    //database file name
    $database_file = $database.'.sql';
    $new_database_file = $new_database.'.sql';

    if(file_exists('backup/'.$new_database_file)) {

        unlink('backup/'.$new_database_file);

        //backup project database
        $command = "C:/xampp/mysql/bin/mysqldump --host=$new_host --user=$new_user --password=$new_pass $new_database > backup/$new_database_file";
        system($command);

    } else {

        //backup project database
        $command = "C:/xampp/mysql/bin/mysqldump --host=$new_host --user=$new_user --password=$new_pass $new_database > backup/$new_database_file";
        system($command);
    }
} else {

    echo 0;
}

【问题讨论】:

  • 也许这个代码$row = mysqli_fetch_assoc($query_get_payroll)返回了一个falsy值?因此,while 循环没有运行。
  • @Wreigh 我没有注意到...非常感谢。
  • 不客气,您可以按照 Naga 的回答检查 variable 是否已设置,或者 iCoders 回答以确保 variable 已设置现在。

标签: php while-loop


【解决方案1】:

如果查询没有返回任何行,mysqli_fetch_assoc() 将第一次返回false,因此您永远不会进入循环,也永远不会分配给变量。如果您随后尝试使用该变量,则会收到该警告。

你可以在循环之前给它一个默认的初始值,或者你可以把你的测试改成:

if (!empty($query_add_landdev_temp_payroll))

顺便说一句,该变量仅包含循环最后一次迭代中INSERT 的结果。也许您应该将if 块放在循环中,紧跟在INSERT 之后?

另外,没有必要在循环中执行INSERT。你可以用一个查询来完成整个事情:

INSERT INTO temp_payroll_landdev(ntp_id, userid, transaction_id, ntp_number, contractor_name, allotment_code, category_name, block_number, activity, lot_numbers, regular_labor, quantity)
SELECT ntp_with_ob_payroll_transaction.ntp_id, ntp_with_ob_payroll_transaction.allotment_code, ntp_with_ob_payroll_transaction.category_name, ntp_with_ob_payroll_transaction.block_number, ntp_with_ob_payroll_transaction.activity, ntp_with_ob_payroll_transaction.lot_number, ntp_with_ob_payroll_transaction.labor_cost, other_budget.quantity 
FROM ntp_with_ob_payroll_transaction 
JOIN other_budget ON ntp_with_ob_payroll_transaction.ob_id = other_budget.ob_id 
WHERE other_budget.transaction_id = $transaction_id AND other_budget.ob_number = '$ntp_number' AND is_payroll = 0

【讨论】:

  • 这是对的。它返回 FALSE 因为我的 $query_get_payroll 没有数据。非常感谢您的回答。
【解决方案2】:

只需像这样更新if 条件,

if(isset($query_add_landdev_temp_payroll) && $query_add_landdev_temp_payroll) 

【讨论】:

    【解决方案3】:

    看起来您在while 命令中使用了一个变量。因此,在该命令之外,该变量将不会定义。尝试在while 命令之前使用$query_add_landdev_temp_payroll = null;。希望对你有帮助!

    【讨论】:

    • 我刚刚注意到我的 $query_get_payroll 没有价值,这就是它未定义的原因。感谢@Wreigh
    猜你喜欢
    • 2015-10-09
    • 2016-02-19
    • 1970-01-01
    • 2012-06-01
    • 1970-01-01
    • 2015-03-06
    • 1970-01-01
    • 2012-06-17
    • 1970-01-01
    相关资源
    最近更新 更多