Heim  >  Fragen und Antworten  >  Hauptteil

Ändern Sie das PHP-Array, um einfache Anführungszeichen zu umgehen

Ich lade eine XLSX-Datei auf eine Website hoch, lese sie in ein Array ein und füge sie dann in den MS-SQL-Server ein. Der Code läuft einwandfrei, es sei denn, die Eingabedatei enthält einfache Anführungszeichen. Ich denke, das Problem besteht darin, dass ich die einfachen Anführungszeichen innerhalb der INSERT-Anweisung oder des Arrays maskieren muss, aber ich bin mir nicht sicher, wie. Was muss ich hier tun, damit einfache Anführungszeichen im Array in der Excel-Datei nicht dazu führen, dass das Einfügen fehlschlägt?

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 Tage vor560

Antworte allen(1)Ich werde antworten

  • P粉378264633

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

    既然您已经使用了 PDO,那么最好的方法是使用带有转义参数的 PDO 准备语句。

    您将传递给 execute() 两个 参数,即带有占位符的 SQL 查询 - 类似于

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

    以及这些占位符中要包含的值。

    $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);
    }

    Antwort
    0
  • StornierenAntwort