Modifier le tableau PHP pour échapper aux guillemets simples
P粉978551081
P粉978551081 2024-04-01 20:35:28
0
1
636

Je télécharge un fichier .xlsx sur un site Web, je le lis dans un tableau, puis je l'insère dans le serveur MS SQL. Le code s'exécute parfaitement sauf si le fichier d'entrée contient des guillemets simples. Je pense que le problème est que je dois échapper aux guillemets simples à l'intérieur de l'instruction d'insertion ou du tableau, mais je ne sais pas comment. Que dois-je faire ici pour que les guillemets simples dans le tableau du fichier Excel ne provoquent pas l'échec de l'insertion ?

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粉978551081
P粉978551081

répondre à tous(1)
P粉378264633

Maintenant que vous utilisez déjà PDO, la meilleure approche consiste à utiliser une instruction préparée par PDO avec des paramètres échappés.

Vous transmettrez execute() deux paramètres, c'est-à-dire une requête SQL avec des espaces réservés - quelque chose comme

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

et les valeurs à inclure dans ces espaces réservés.

$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);
}
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal