2016-08-19 6 views
0

안녕 얘들 아, foreach와 함께 오류를 처리하고 PHP에서 폭발. 왜 텍스트 영역의 처음 두 줄에서만이 문제가 발생하는지 알 수 없습니다.foreach 및 explode 처리 오류 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; 
        } 
       } 

      } 
     } 
    } 
?> 

내가 텍스트 영역에 배치 텍스트를 한 다음

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 

:

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 ? 

에이 다음과 같은 오류를 표시 제출 제출 후 그것은 내 DB에 빈 행을 만들고, firts 두 행이 제대로 작동하지 않습니다, 여기에 이미지입니다 내가 줄 바꿈에 폭발하는 것을 시도했다

enter image description here

,하지만 나를 위해 일하지 않았다 : 어떻게하는지 내 dB의 모습의 후 제출합니다.

+0

** 경고 ** : mysqli를 사용하는 경우 [매개 변수가있는 쿼리] (http://php.net/manual/en/mysqli)를 사용해야합니다. .quickstart.prepared-statements.php) 및 ['bind_param'] (http://php.net/manual/en/mysqli-stmt.bind-param.php)을 사용하여 쿼리에 사용자 데이터를 추가하십시오. ** 올바르게 이스케이프하는 것을 잊어 버린 경우 심각한 [SQL injection bug] (http://bobby-tables.com/)를 만들 것이므로 수동 이스 케이 핑 및 문자열 보간 또는 연결을 사용하지 마십시오. – tadman

답변

1

당신은 그래서이

array(7) {
[0]=> string(23) "18/08/2016 08:00 34415 " [1]=> string(24) " 18/08/2016 17:56 34415 " [2]=> string(24) " 16/08/2016 07:56 34415 " [3]=> string(24) " 16/08/2016 14:56 34415 " [4]=> string(24) " 17/08/2016 07:56 34415 " [5]=> string(24) " 17/08/2016 15:56 34415 " [6]=> string(0) "" }

array(7)[6]=> string(0) ""

(당신이 6 개 요소가) 당신이 할 일은 분할의 var_dump하자 너무 많은 배열 요소

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

을 생산하고 대신 줄 바꿈 문자로이

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

6 개의 요소를 제공하고 오류를 방지해야합니다. 어느 쪽이든, 당신은 맹목적으로 데이터를 신뢰해서는 안됩니다.

+0

먼저 빠른 응답에 감사드립니다. 나는 이것을 이미 시도했지만 $ conn-> real_escape_string이 텍스트의 줄 바꿈을 제거하고 있다는 것을 깨닫지 못했다. 나는 전에 말했듯이, $ conn-> real_escape_string을 제 코드에서 제거하고 제안을 추가함으로써 문제를 해결했습니다. –