【问题标题】:Handling error with foreach and explode PHP使用 foreach 处理错误并爆炸 PHP
【发布时间】:2026-02-23 05:40:01
【问题描述】:

大家好,我正在处理一个 foreach 错误和 php 爆炸。 我不知道为什么这种情况只发生在文本区域的前两行。

我的代码如下:

<?php
   if(isset($_POST["button"])){
        $btn=$_POST["button"];
        if($btn=="Cargar horarios"){
            $input = $conn->real_escape_string($_POST["lineas"]);
            $linea = explode("NO ?", $input);
            foreach($linea as $element){
                $datos = explode(" ", $element);
                $fecha = $datos[0];
                $hora = $datos[1];
                $empleado_key = $datos[2];

                $sql = "SELECT * FROM jornada WHERE jornada_fecha='$fecha' AND empleados_key='$empleado_key'";
                $result = $conn->query($sql);
                if ($result->num_rows > 0) {
                    $sql = "UPDATE jornada SET jornada_salida='$hora' WHERE jornada_fecha='$fecha' AND empleados_key='$empleado_key'";
                    if ($conn->query($sql) === TRUE) {
                    } else {
                        echo "Error: " . $sql . "<br>" . $conn->error;
                    }
                } else {
                    $sql = "INSERT INTO jornada (jornada_fecha, jornada_entrada, empleados_key) VALUES ('$fecha', '$hora', '$empleado_key')";
                    if ($conn->query($sql) === TRUE) {
                    } else {
                        echo "Error: " . $sql . "<br>" . $conn->error;
                    }
                }

            }
        }
    }
?>

我在textarea中放置的文字如下:

18/08/2016 08:00 34415 NO ?
18/08/2016 17:56 34415 NO ?
16/08/2016 07:56 34415 NO ?
16/08/2016 14:56 34415 NO ?
17/08/2016 07:56 34415 NO ?
17/08/2016 15:56 34415 NO ?

提交时显示以下错误:

Undefined offset: 1 in /home/bgxryqet/public_html/sistema/horarios/cargar-horarios.php on line 88
Undefined offset: 2 in /home/bgxryqet/public_html/sistema/horarios/cargar-horarios.php on line 89

提交后它会在我的数据库中创建一个空行,并且前两行无法正常工作,这是提交后我的数据库的图像:

我曾尝试在换行时爆炸,但它对我不起作用。

【问题讨论】:

  • 警告:使用mysqli 时,您应该使用parameterized queriesbind_param 将用户数据添加到查询中。 不要使用手动转义和字符串插值或连接来完成此操作,因为如果您忘记正确转义某些内容,您将创建严重的SQL injection bugs

标签: php mysql sql explode


【解决方案1】:

你产生了太多的数组元素

$linea = explode("NO ?", $input);

让我们var_dump这个

数组(7){
[0]=> 字符串(23)“18/08/2016 08:00 34415”[1]=> 字符串(24)“18/08/2016 17:56 34415 " [2]=> 字符串 (24) " 16/08/2016 07:56 34415 " [3]=> 字符串 (24) " 16/08/2016 14:56 34415 " [4]=> 字符串 (24) " 2016 年 8 月 17 日 07:56 34415 " [5]=> 字符串 (24) " 2016 年 8 月 17 日 15:56 34415 " [6]=> 字符串(0) "" }

注意array(7)(你有6个元素)和[6]=&gt; string(0) ""

你应该做的是用换行符来分割它

$linea = explode("\n", $input);

应该给你 6 个元素并避免错误。无论哪种方式,您都不应该盲目相信数据。确保在尝试插入之前正确获取数据

【讨论】:

  • 首先感谢您的快速响应。我已经尝试过了,但我没有意识到 $conn->real_escape_string 正在删除我的文本的换行符。正如我之前所说,通过从我的代码中删除 $conn->real_escape_string 并添加您的建议,我已经解决了这个问题。