Rumah  >  Soal Jawab  >  teks badan

Ubah suai tatasusunan PHP untuk melepaskan petikan tunggal

Saya sedang memuat naik fail .xlsx ke tapak web dan membacanya ke dalam tatasusunan dan kemudian memasukkannya ke dalam pelayan ms sql. Kod berjalan dengan sempurna melainkan fail input mengandungi petikan tunggal. Saya rasa masalahnya ialah, saya perlu melarikan petikan tunggal di dalam pernyataan sisipan atau tatasusunan, tetapi saya tidak pasti bagaimana. Apakah yang perlu saya lakukan di sini supaya petikan tunggal dalam tatasusunan dalam fail excel tidak menyebabkan sisipan gagal?

protected function excel_to_assocative_array($file) {
        try {
            $reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReaderForFile($file);
            $reader->setReadDataOnly(false);
            $reader->setReadEmptyCells(false);
            $spreadsheet = $reader->load($file);
            $worksheet = $spreadsheet->getActiveSheet();
            $values = $this->get_worksheet_values($worksheet);
    
            return $values;
        } catch(\Exception $e) {
            return new \WP_Error(500, 'Failed parsing Excel file.', 'executor');
        }
    }


    protected function insert_into_database($data) {
        $map = "company_map";
        $map = $map();
        $database_ready_data = $this->map_headers($map, $data);
        $database_ready_data = $this->add_fields($database_ready_data);

        if(is_wp_error($database_ready_data)) {
            return $database_ready_data;
        }

        $dsn = '';
        $user = '';
        $password = '';
    
        try {
            $dbh = new \PDO($dsn, $user, $password);
        } catch (\PDOException $e) {
            return new \WP_Error(500, "Could not connect to the database. ({$e->getMessage()}");
        }
    
        $column_names = implode('],[', array_keys($database_ready_data[0]));
        $values = array_map(function($value) {
            return "'" . implode("', '", $value) . "'";
        }, $database_ready_data);
        $values = "(" . implode("), (", $values) . ")";
        $sql = new SQL("INSERT INTO {$this->company_db_tables[$this->company]} ([{$column_names}]) VALUES {$values}");
        print_r($sql);
        $stmt = $dbh->prepare($sql->get_clause());
    
        try {
            $stmt->execute();
        }
        catch(\PDOException $e) {
            return new \WP_Error(500, __('Something went wrong, please contact your site administrator.', 'executor'));
        }
    
        return true;
    }

P粉978551081P粉978551081224 hari yang lalu562

membalas semua(1)saya akan balas

  • P粉378264633

    P粉3782646332024-04-02 10:01:06

    Sekarang anda sudah menggunakan PDO, pendekatan terbaik ialah menggunakan pernyataan PDO yang disediakan dengan parameter yang dilepaskan.

    Anda akan lulus execute() dua parameter, iaitu pertanyaan SQL dengan ruang letak - seperti

    INSERT INTO table (fld1, fld2) VALUES (?, ?)

    dan nilai yang perlu dimasukkan dalam ruang letak ini.

    $names = [ ];
    $posts = [ ];
    $values= [ ];
    foreach ($database_ready_data[0] as $key => $value) {
        $names[] = "[{$key}]";
        $posts[] = "?";
        $values[]= $value;
    }
    
    $sqlTbl   = $this->company_db_tables[$this->company];
    $sqlNames = implode(',', $names);
    $sqlPosts = implode(',', $posts);
    
    $sql = "INSERT INTO {$sqlTbl} ({$sqlNames}) VALUES ({$sqlPosts})";
    
    $stmt = $dbh->prepare($sql);
    
    try {
         $stmt->execute($values);
    }

    balas
    0
  • Batalbalas