PDO inserts NULL byte at position 254 on SQL Server ntext column
Nessuno ha ancora preso questa issue.
- Lingua principale
- C
- Stelle
- 40.4k
- Fork
- 8.1k
- Merge medio
- 2g 13h
- PR unite (30g)
- 96
Descrizione
Description
The following code:
<?php
try {
$pdo = new PDO('odbc:DRIVER={SQL Server};SERVER=SHS\HS2017,49011;DATABASE=OIDDB', '', '');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$query = 'SELECT name, description, protected, visible, value FROM oidplus_config';
$stmt = $pdo->query($query);
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);
foreach ($results as $row) {
if (($p = strpos($row['value'],"\0")) !== false) echo "PROBLEM: NULL BYTE FOUND AT ".$row['name']." AT POSITION $p\n";
}
} catch (PDOException $e) {
echo "Error: " . $e->getMessage();
}
Resulted in this output:
PROBLEM: NULL BYTE FOUND AT oidplus_private_key AT POSITION 254
PROBLEM: NULL BYTE FOUND AT oidplus_public_key AT POSITION 254
But I expected this output instead:
(Nothing)
I have verified that in the database the NULL byte is not there. In the database, the field has the correct length, in PHP strlen() is 1 byte too much, because of the inserted NULL byte
This seems to be very similar to the bug described at https://bugs.php.net/bug.php?id=74021
The SQL table is created as follows:
USE [OIDDB]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[oidplus_config](
[name] [nvarchar](50) NOT NULL,
[value] [ntext] NOT NULL,
[description] [nvarchar](255) NULL,
[protected] [bit] NOT NULL,
[visible] [bit] NOT NULL,
CONSTRAINT [PK_oidplus_config] PRIMARY KEY CLUSTERED
(
[name] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
ALTER TABLE [dbo].[oidplus_config] ADD DEFAULT ('0') FOR [protected]
GO
ALTER TABLE [dbo].[oidplus_config] ADD DEFAULT ('0') FOR [visible]
GO
PHP Version
8.4.1 (also tested with 8.3.6)
Operating System
Windows 10
Guida per i contributori
Apri la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Direzione di ricerca
Eseguire il riproduttore PDO ODBC fornito sulla colonna ntext di SQL Server e ispezionare il valore recuperato intorno alla posizione 254. Non sono indicati file sorgente o test; il lavoro è completato quando PDO non restituisce più un byte NULL inserito e la lunghezza della stringa recuperata corrisponde al valore nel database.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Valutazione
- Stack tecnologico
- php, sql
- Ambito
- database
- Tipo di issue
- Bug
- Difficoltà
- 4/5
- Tempo stimato
- 3-5 giorni
- Stato di attività
- Ferma
- Chiarezza
- Specificata chiaramente
- Idoneità per principianti
- 35/100