Maison > Questions et réponses > le corps du texte
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粉3782646332024-04-02 10:01:06
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); }