2016-08-19 26 views
0

こんにちは、私はPHPでforeachと爆発でエラーを処理しています。 なぜこのことがテキスト領域の最初の2行だけで起こっているのかわかりません。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; 
        } 
       } 

      } 
     } 
    } 
?> 

私はテキストエリアに置くテキストは以下の通りです:

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 

送信した後、それは私のデータベースに空の行を作成し、firts 2行が正しく動作していない、ここではイメージです私は改行で爆発しようとしてい

enter image description here

、それは私のために働いていなかった。どうするか私のデシベルがどのように見えるの後に提出します。

+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インジェクションのバグ](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つの要素を持っている)と[6]=> string(0) ""

が分割さのvar_dumpましょうあまりにも多くの配列要素

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

を生産していますこの代わりに改行で

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

6つの要素を与え、エラーを回避する必要があります。いずれにしても、データを盲目的に信頼すべきではありません。

+0

まず最初に、すばやい応答に感謝します。私はすでにこれを試しましたが、$ conn-> real_escape_stringがテキストの改行を削除していたことに気付きませんでした。私は私のコード$ conn-> real_escape_stringを削除し、あなたの提案を追加することで、前に述べたように問題を解決しました。 –