Невозможно передать список массивов angular в php скрипт для вставки в mysql таблицу - PullRequest
4 голосов
/ 06 августа 2020

From angular пытается вставить данные листа Excel в таблицу базы данных mysql с помощью сценария php. Я установил xlsx в angular, а затем попытался прочитать лист xlsx.

Ниже мой класс CandidateuploadComponent.ts

import * as XLSX from 'xlsx'; 
export class CandidateuploadComponent implements OnInit {

constructor(private userSvc: AddUsersService,private route: Router) { }

ngOnInit() {
}
title = 'XlsRead';
file:File
arrayBuffer:any
filelist:any

addfile(event)     
{    
  this.file= event.target.files[0];     
  let fileReader = new FileReader();    
  fileReader.readAsArrayBuffer(this.file);     
  fileReader.onload = (e) => {    
  this.arrayBuffer = fileReader.result;    
  var data = new Uint8Array(this.arrayBuffer);    
  var arr = new Array();    
  for(var i = 0; i != data.length; ++i) arr[i] = String.fromCharCode(data[i]);    
  var bstr = arr.join("");    
  var workbook = XLSX.read(bstr, {type:"binary"});    
  var first_sheet_name = workbook.SheetNames[0];    
  var worksheet = workbook.Sheets[first_sheet_name];    
  console.log(XLSX.utils.sheet_to_json(worksheet,{raw:true}));    
        var arraylist = XLSX.utils.sheet_to_json(worksheet,{raw:true});     
        this.filelist = [];    
        let usersJson: any[] = arraylist;
 // Sends the form data to the service
  this.userSvc.sendFormData(XLSX.utils.sheet_to_json(worksheet,{raw:true})).subscribe(
  response => console.log("Success! ", response)
  // error => console.error("Error: ", error)
  );
       
  }    

  }       

  }

класс обслуживания

sendFormData(userData) {
console.log('hi');
console.log(userData);
return this.http.post("http://localhost:8088/post_candidateDetails.php", userData);
}

Belwo - это php .script

<?php
header("Access-Control-Allow-Origin: http://localhost:4200");
header("Access-Control-Allow-Credentials: true ");
header('Access-Control-Allow-Methods: GET, PUT, POST, DELETE, OPTIONS');
header("Access-Control-Allow-Headers: X-Custom-Header, Origin, Content-Type , Authorisation , X-Requested-With");
header("Content-Type: application/json; charset=UTF-8 ");
$json = file_get_contents('php://input');
$decoded = json_decode($json, true);
$tab = $decoded['tab'];
function conn() {
  $dbhost = "**********";
  $user = "*****";
  $pass = "*****";
  $db = "*********";
  $conn = new PDO('mysql:host=******;dbname=******', $user, $pass);
  return $conn;
}
$db = conn();
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);                  
$p = $db->prepare("INSERT INTO CandidateDetails(EmployeeId, FirstName, LastName, Mobile,Email)VALUES(:EmployeeId,:FirstName,:LastName,:Mobile,:Email)");
                       
foreach ($tab as $item) {
  $p->execute($item);
}
echo json_encode(true);

?>

Ниже я получаю ошибку в браузере и почтальоне по-разному, первая ошибка в браузерах - это строка номер 9 в php script undifine index: tab и ошибка post man: <b>Warning</b>: Invalid argument supplied for foreach() in <b>C:\xampp\htdocs\post_candidateDetails.php</b> on line <b>23</

enter image description here

enter image description here

I refer this axample for php script:

Есть ли способ отправить массив json на сервер php и вставить его значения в таблицу?

Получение ошибки Неопределенный индекс: вкладка для вставки списка массивов с использованием сценария php В служебном методе я получаю данные json, как показано в приведенной выше отладке браузера, я пытаюсь, так как неделю не разрешается, все еще, пожалуйста, помогите мне решить эту проблему.

Обновлен PHP скрипт в соответствии с предложением Оливье.

    <?php
    header("Access-Control-Allow-Origin: http://localhost:4200");
    header("Access-Control-Allow-Credentials: true ");
    header('Access-Control-Allow-Methods: GET, PUT, POST, DELETE, OPTIONS');
    header("Access-Control-Allow-Headers: X-Custom-Header, Origin, Content-Type , Authorisation , X-Requested-With");
    header("Content-Type: application/json; charset=UTF-8 ");

    $json = file_get_contents('php://input');
    $decoded = json_decode($json, true);

    print_r($decoded);

    function conn()
    {
        $dbhost = "************";
        $user = "*******";
        $pass = "*******";
        $db = "********";
        $conn = new PDO('mysql:host=*******;dbname=*******', $user, $pass);
        return $conn;
    }
    $db = conn();
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);                  
    $p = $db->prepare("INSERT INTO CandidateDetails(EmployeeId, FirstName, LastName, Mobile,Email)VALUES(:EmployeeId,:FirstName,:LastName,:Mobile,:Email)");
                       
    foreach ($decoded as $item) {
      $p->execute($item);
    }

    echo json_encode(true);

    ?>

вывод в браузере с ошибкой после того, как предложил Оливье:

    Array
    (
        [0] => Array
            (
                [Employeeid] => 1
                [FirstName] => fn1
                [LastName] => ln1
                [Mobile] => 123456789
                [Email] => Email1
            )

        [1] => Array
            (
                [Employeeid] => 2
                [FirstName] => fn2
                [LastName] => ln2
                [Mobile] => 123456790
                [Email] => Email2
            )

        [2] => Array
            (
                [Employeeid] => 3
                [FirstName] => fn3
                [LastName] => ln3
                [Mobile] => 123456791
                [Email] => Email3
            )

        [3] => Array
            (
                [Employeeid] => 4
                [FirstName] => fn4
                [LastName] => ln4
                [Mobile] => 123456792
                [Email] => Email4
            )

    )
    <br />
    <b>Fatal error</b>:  Uncaught PDOException: SQLSTATE[HY093]: Invalid parameter number: parameter was not defined in C:\xampp\htdocs\post_candidateDetails.php:27
    Stack trace:
    #0 C:\xampp\htdocs\post_candidateDetails.php(27): PDOStatement-&gt;execute(Array)
    #1 {main}
      thrown in <b>C:\xampp\htdocs\post_candidateDetails.php</b> on line <b>27</b><br />

1 Ответ

3 голосов
/ 08 августа 2020

В сообщении говорится, что в данных JSON нет элемента tab, что совершенно нормально, поскольку вы не отправляете такой элемент.

Настоящая проблема в том, что вы копируете / вставляете какой-то код, не понимая, что он делает. Парень, у которого вы взяли код, говорит по-французски, и французское слово для обозначения массива - «tableau», которое в программах часто сокращается как «tab». Таким образом, он, очевидно, сохранил свой массив в элементе tab.

Но это не то, что вы делаете. Вы конвертируете свой массив напрямую в JSON, что означает, что $decoded уже является массивом. Вместо этого вы должны сделать что-то вроде этого:

$decoded = json_decode($json, true);
foreach ($decoded as $item) {
    $p->bindValue(':EmployeeId', $item['Employeeid'], PDO::PARAM_INT);
    $p->bindValue(':FirstName', $item['FirstName'], PDO::PARAM_STR);
    $p->bindValue(':LastName', $item['LastName'], PDO::PARAM_STR);
    $p->bindValue(':Mobile', $item['Mobile'], PDO::PARAM_STR);
    $p->bindValue(':Email', $item['Email'], PDO::PARAM_STR);
    $p->execute();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...