Ubah suai tatasusunan PHP untuk melepaskan petikan tunggal
P粉978551081
P粉978551081 2024-04-01 20:35:28
0
1
631

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

membalas semua(1)
P粉378264633

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);
}
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan