2015-05-28 2 views
-1

Я думаю, вам не нужно смотреть на весь код, но я все равно включу его.PHP: неопределенное смещение при импорте из csv

<?php if (!$_POST) { ?> 
<!DOCTYPE html> 
<html> 

<div class="header"> 
    <img src="images/logo.png" alt="logo" /> 

</div> 

<body background="images/background.png" > 

     <form action="" method="post" enctype="multipart/form-data"> 
      Choose your file: <br /> 
      <input name="csv" type="file" id="csv" /> <br /> <br /> 
      <input type="submit" name="Submit" value="Submit" /> 
     </form> 
    </body> 
</html> 
<?php 
} else { 
$connect = new mysqli("localhost", "username", "password", "csvdb"); 
if ($_FILES['csv']['size'] > 0) { 
    //get the csv file 
    $file = $_FILES['csv']['tmp_name']; 
    $handle = fopen($file, "r"); 
    $i = 0; 
    while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) { 
     if ($i > 0) { 
$import = "INSERT into csvtb(project_id,unit_id,phase,building,level,orientation,apartment_type,size,garden,garden_and_terrace_size,bedrooms,parking,floorplan,sold) values('$data[1]','$data[2]','$data[3]','$data[4]','$data[5]','$data[6]','$data[7]','$data[8]','$data[9]','$data[10]''$data[11]','$data[12]','$data[13],'$data[14])"; 
      $connect->query($import); 
     } 
     $i++; 
    } 
    fclose($handle); 
    print "Import done"; 
} 
} 
?> 

ошибка в строке 30, неопределенного смещение

$import = "INSERT into csvtb(project_id,unit_id,phase,building,level,orientation,apartment_type,size,garden,garden_and_terrace_size,bedrooms,parking,floorplan,sold) values('$data[1]','$data[2]','$data[3]','$data[4]','$data[5]','$data[6]','$data[7]','$data[8]','$data[9]','$data[10]''$data[11]','$data[12]','$data[13],'$data[14])"; 
      $connect->query($import); 

Я проверил мой код, используя много PHP онлайн инструменты проверки, они говорят, что код чист. Думаю, я знаю, что такое ошибка, я думаю, это потому, что я не вставляю в индекс 0, потому что я хочу, чтобы это был идентификатор моей базы данных. Я не уверен, хотя, если бы я был, я бы не спросил. Наверное, мои навыки PHP не так хороши.

+1

Ваш SQL неверен. Youve несколько несовпадающих/болтающихся '' 'там. и если вы получаете неопределенное смещение, вы пытаетесь получить доступ к индексу в массиве, который не существует. do 'var_dump ($ data)', чтобы увидеть, как выглядят данные csv в этой точке. вы, вероятно, найдете его коротким на 1 или более полей по сравнению с другими строками. –

+0

Вы начинаете с индекса 1, я думаю, вам нужно начать с индекса 0. '$ data [0]' вместо '$ data [1]' в вашем запросе 'INSERT'. – RST

+0

@RST это то, о чем я тоже думал и упомянул в своем вопросе – Lynob

ответ

0

Возможно, что некоторые строки в вашем CSV имеют меньше данных, чем указано в запросе. Я бы рекомендовал обработать это так, чтобы вы могли регистрировать/отлаживать.

Используя ваш пример кода, я только что сделал несколько ранних выходов, если данные не найдены действительными. Вы можете применить такую ​​же логику и распечатать строки, которые не имеют всего 15 элементов массива. Кажется, вы пропускаете элемент 0 и выбираете 1..14. Это абсолютно нормально; просто проверьте, чтобы все строки давали вам 15 элементов массива.

<?php 
if ($_POST) 
{ 
    $connect = new mysqli("localhost", "username", "password", "csvdb"); 
    if ($_FILES['csv']['size'] > 0) 
    { 
     //get the csv file 
     $file = $_FILES['csv']['tmp_name']; 
     $handle = fopen($file, "r"); 

     $i = 0; 
     $expected_array_count = 15; 

     while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) 
     { 
      // skip first line 
      if ($i == 0) { i++; continue; } 

      // print offending line and continue to the next line 
      // if array does not have the expected count 
      if (count(data) !== $expected_array_count) 
      { 
       echo sprintf("Line %d has %d lines; %d expected: %s", 
        $i+1, 
        count(data), 
        $expected_array_count, 
        implode("~~", $array) 
       ); 

       i++; 
       continue; 
      } 

      performImport($data); 
      $i++; 
     } 
     fclose($handle); 
     print "Import done"; 
    } 
<?php 
} 

else 
{ 
    <!DOCTYPE html> 
    <html> 

    <div class="header"> 
     <img src="images/logo.png" alt="logo" /> 
    </div> 

    <body background="images/background.png" > 
      <form action="" method="post" enctype="multipart/form-data"> 
       Choose your file: <br /> 
       <input name="csv" type="file" id="csv" /> <br /> <br /> 
       <input type="submit" name="Submit" value="Submit" /> 
      </form> 
     </body> 
    </html> 
} 


// function does the importing 
function performImport($data) 
{ 
    global $connect; 

    // instead of entering data like this, there are 
    // better alternatives 
    $import = " 
    INSERT into csvtb 
    (
     project_id,unit_id,phase, 
     building,level,orientation, 
     apartment_type,size,garden, 
     garden_and_terrace_size,bedrooms,parking, 
     floorplan,sold 
    ) 
    values 
    (
     '$data[1]','$data[2]','$data[3]', 
     '$data[4]','$data[5]','$data[6]', 
     '$data[7]','$data[8]','$data[9]', 
     '$data[10]','$data[11]','$data[12]', 
     '$data[13]','$data[14]' 
    )"; 

    // one alterate 
    // $import = sprintf("insert into ... values (%d, %s, %d...)", $data[1], $data[2] ...) 

    // another alternate (http://php.net/manual/en/mysqli-stmt.bind-param.php) 
    // $import = "insert into ... values (?, ?, ...)" 
    // mysqli_stmt_bind_param($import, 'sss...', $data[1], $data[2]...); 

    // yet another alternate: use PDO 
    $connect->query($import); 
} 
?> 
Смежные вопросы