Problème en passant de php 5.6 legacy à php 5.6 stable

Hello à tous

paypal ayant mis à jour son système de sécurité, je dois passer de php 5.6 legacy à php 5.6 stable

jusqu'ici j'avais un script qui fonctionnait bien pour mettre à jour une table sql à partir d'un fichier csv téléchargé depuis une url

mais dès que je passe de legacy à stable la table ne se met plus à jour

si je me remets en legacy, ça refonctionne

voilà la ligne qui pose problème :

$bdd->exec('LOAD DATA LOCAL INFILE 'prix.csv' REPLACE into TABLE prix FIELDS TERMINATED BY ','') ;


en mettant à la fin de la ligne or die print_r pour savoir ce qui se passe j'obtiens l'information suivante :

Array ( [0] => 00000 [1] => [2] => ) 1

pourtant mon fichier csv est loin d'être vide… et encore une fois, ça fonctionne très bien en 5.6 legacy


un grand merci d'avance pour votre précieuse aide !!!

Bonjour,

Le script est lancé comment ?
Via le Web ou le cron ?

Es tu sur que c'est bien php 5.6 qui lance le cron ?
Car en legacy le php minimal est php 4.4.9
Et en stable php 5.3.x.
La connexion a la bdd se fait bien en stable ?
Car la ton erreur n'indique pas grand chose.

merci pour ta réponse Buddy !
le script est lancé via le cron
dans les options du cron, j'ai mis "langue" php 5.6
tout comme dans la version php globale (sous informations générales)
qu'entends-tu par la connexion à la bdd se fait bien stable ?
je ne comprends pas, que-dois faire de particulier ?

Avant ta ligne que tu cités tu te connectés bien à la base de donnés non ?

As tu vérifié que la connexion se fait bien.

Nb : j'aurai plutôt mis le coup le try/catch pour chopper les erreurs.
http://fr2.php.net/manual/fr/pdo.transactions.php

oui la connexion tout ok
j'ai fait comme tu as dit avec try/catch, j'ai le même message d'erreur
j'ai fait le teste en cron et en lançant moi même le script, c'est pareil
j'ai testé en php 5.4, 5.5, 5.6, 7.0 et 7.1
pour chaque version, chaque fois que je suis en legacy ça marche et chaque fois que je suis en stable ça plante… incompréhensible
est-ce que ça peut venir des paramètres de ma table sql ?

Il faudrait l'erreur exacte..

Tu as mis quoi comme code exactement (en cachant le mdp et l'user mysql) ?

voilà le code ci-dessous
si j'enlève le or die print_r je n'ai aucun message d'erreur, mais la table ne se met pas à jour quand même
si laisse le or die print_r j'ai l'erreur mentionnée dans mon message ci-dessus
la connexion à la base de données se fait par contre correctement
try
{
$bdd = new PDO('mysql:host=xxx.xxx.xx;dbname=xxx', 'xx', 'xx');
}

catch (Exception $e)
{
die('Erreur : ' . $e->getMessage());
}

$ftp_server='xxx';
$ftp_user_name='xxx';
$ftp_user_pass='xxx';
echo "
Mise en place d'une connexion basique";
$conn_id = ftp_connect($ftp_server) or die("
Impossible de se connecter au serveur $ftp_server" );
echo "
Identification avec un nom d'utilisateur et un mot de passe ";
$login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass);
echo "
Verification de la connexion ";
if ((!$conn_id) || (!$login_result))
{
echo "
La connexion FTP a echoue !
";
echo "
Tentative de connexion au serveur $ftp_server pour l'utilisateur $ftp_user_name ";
exit;
}
else {
echo "
Connexion au serveur $ftp_server, pour l'utilisateur $ftp_user_name
";
}

try {
$bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$bdd->beginTransaction();
$bdd->exec('LOAD DATA LOCAL INFILE 'prix' REPLACE into TABLE prix FIELDS TERMINATED BY ','') or die(print_r($bdd->errorInfo()));
$bdd->commit();
} catch (Exception $e) {
$bdd->rollBack();
echo "Failed: " . $e->getMessage();
}

?>

et si tu le remplaces par une requête SQL plus simple (du style un Select, çà marche ? )

Je ne sais pas sinon …

oui une requête de type select fonctionne sans problème
y a vraiment un problème avec LOAD DATA LOCAL INFILE … REPLACE into et uniquement quand je suis en "stable"
j'ai ouvert un ticket et on me dit que c'est un problème de webmaster mais là je ne sais plus ce qu'il faut penser

J'ai encore fait quelques tests et j'obtiens vraiment des trucs étonnants…
Juste pour expliquer : j'update une fois par jour une table sql avec un fichier csv.
En mode stable, si j'importe le fichier csv, j'ai le message d'erreur décrit ci-dessus et rien ne se met à jour.
Si j'essaie de supprimer la première ligne du tableau (qui comportent les données de la veille) avant d'importer le fichier avec les données du jour, il me recrée la dernière ligne effacée, avec les données de la veille, sans me créer de message d'erreur. Par contre il ne me met quand même pas à jour le tableau avec les données du jour !!! C'est comme si en mode stable il ne parvenait pas à lire la 2e ligne du fichier csv (la première ligne comporte les en-têtes).

En mode legacy par contre, dans tous les cas, pas de message d'erreur et la table se met à jour sans aucun problème…

Ça veut dire que c'est logiciel (code de ton site) et qu'ils ne s'en occuperont pas.

Bonjour,

La différence entre legacy et stable c'est l'utilisation du driver.

* Legacy : utilisation de la lib mysql fournit par mysql
* Stable : utilisation de la lib mysqlnd fournit par php

Il y a la possibilité de faire un workaround :

USE database
DROP TABLE IF EXISTS `TEMPTABLE`;

CREATE TABLE `TEMPTABLE` SELECT NAME,VALUE FROM `ORIGTABLE` WHERE 1=2;

LOAD DATA LOCAL INFILE '/path/to/file'
INSERT INTO TABLE `TEMPTABLE`
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\r\n'
IGNORE 1 LINES
(NAME, VALUE);

INSERT INTO `ORIGTABLE` (NAME, VALUE)
SELECT NAME, VALUE FROM `TEMPTABLE`
ON DUPLICATE KEY UPDATE VALUE = VALUES(VALUE);

DROP TABLE `TEMPTABLE`;

Cela va créer une table temporaire, sourcer les données dedans, et insérer les données de la table temporaire dans la table de production avec un remplacement de valeur lors d'une duplication.

Cdt,

Merci Ludo pour ta réponse
j'ai essayé mais je suis déjà bloqué à LOAD DATA LOCAL INFILE '/path/to/file'
INSERT INTO TABLE `TEMPTABLE`…
INSERT vraiment ? pas REPLACE ?
j'ai le message d'erreur "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'INSERT INTO TABLE …"
j'ai essayé avec REPLACE mais j'ai encore et toujours le même problème que cité ci-dessus

Bonjour,
j'ai le même genre de problème avec mon sqlprivate;
avant j'utilisais toujours la fonction importer un fichier csv data local dans mon phpmyadmin;
depuis quelques mois ca ne fonctionne plus: ca affiche erreur 2027 malformed packet ;
résultat des courses j'ai du générer un fichier texte du type;
insert into table valeur 1
insert into table valeur 2
là ca fonctionne mais ca me prend 3 x plus de temps
steph