为了解释上下文,我有一个CSV文件来循环。
我已经用下面的代码检查过了,实际上我已经准备好了CSV文件的每一行。
if (file_exists($file)){
$fic = fopen($file, 'rb');
$linecount = 0;
for ($ligne = fgetcsv($fic, 1024,";"); !feof($fic); $ligne = fgetcsv($fic, 1024,";")) {
$linecount++;
}
}
else {
/*do smth*/
}
echo $linecount;但是,当我用我真正想要的代码替换$linecount++时:
$codeArticle = $ligne[0]; //Code Article
$nomArticle = $ligne[1]; //Nom Article
$refGamme = $ligne[2]; //Référence Gamme
$nomGamme = $ligne[3]; //Nom Gamme
$codeSSRef = $ligne[4]; //Code Sous Référence
$libelleSSRef = $ligne[5]; //Libellé Sous Référence
$queryGammes = "INSERT INTO Gamme VALUES('$refGamme','$nomGamme');";
$querySSRef = "INSERT INTO SS_Ref VALUES('$codeSSRef','$libelleSSRef');";
$queryProduits = "INSERT INTO Produit VALUES('$codeArticle','$nomArticle',NULL,'$refGamme','$codeSSRef');";
$result = $pdo->query($queryGammes);
$result = $pdo->query($querySSRef);
$result = $pdo->query($queryProduits);在运行这段代码时没有出现错误,但是当我查看db (mysql)时,在名为Produit的表中只有339行,每一行CSV行中应该有1行。这些行实际上很好,请求运行得很好,但我不明白为什么这段代码没有将我的文件的每一行插入到我的DB中。
有什么建议吗?我真的被困在这里了,这很重要,所以我会接受任何建议。
发布于 2017-03-27 14:10:40
对于我得到的每一个答案,我找到了一个解决方案,首先我使用了@maxpovver (我粘贴了他给出的got )和@Chris建议的参数化查询。
Thx到@lvaro González和“您的常识”我成功地打印了PDO错误,这告诉我特殊字符有一些问题。将PDO字符集设置为utf8并不足以改变入口的问题,但它解决了退出时的问题:当我从DB中检索特殊字符时,会很好地打印它们。
为了解决这个问题,我必须使用utf8_encode php函数:
$result = $queryGammes->execute(array(
"refGamme"=> $refGamme,
"nomGamme"=> utf8_encode($nomGamme))
);发布于 2017-03-27 10:53:17
我几乎可以肯定,由于将值直接插入到sql中,所以会出现问题。下面是你应该做的事情:
if (file_exists($file)){
$fic = fopen($file, 'rb');
$linecount = 0;
// generate prepared statements only once and reuse them in loop
$queryGammes = $pdo->prepare("INSERT INTO Gamme VALUES(:refGamme,:nomGamme);");
$querySSRef = $pdo->prepare("INSERT INTO SS_Ref VALUES(:codeSSRef,:libelleSSRef);");
$queryProduits = $pdo->prepare"INSERT INTO Produit
VALUES(:codeArticle,:nomArticle,NULL,:refGamme,:codeSSRef);");
for ($ligne = fgetcsv($fic, 1024,";"); !feof($fic); $ligne = fgetcsv($fic, 1024,";")) {
$codeArticle = $ligne[0]; //Code Article
$nomArticle = $ligne[1]; //Nom Article
$refGamme = $ligne[2]; //Référence Gamme
$nomGamme = $ligne[3]; //Nom Gamme
$codeSSRef = $ligne[4]; //Code Sous Référence
$libelleSSRef = $ligne[5]; //Libellé Sous Réfé
// execute queries using generated statements, not $pdo directly
$result = $queryGammes->execute(array("refGamme"=> $refGamme, "nomGamme"=> $nomGamme));
$result = $querySSRef->execute(array("codeSSRef"=>$codeSSRef, "libelleSSRef"=>$libelleSSRef));
$result = $queryProduits->execute(array("codeArticle"=>$codeArticle, "nomArticle"=>$nomArticle, "refGamme"=> $refGamme,"codeSSRef"=>$codeSSRef));
}
}您也可以在不使用命名参数的情况下完成它,但我不建议这样做,因为这些代码的可读性较低(以后更难记住它做了什么):
if (file_exists($file)){
$fic = fopen($file, 'rb');
$linecount = 0;
// generate prepared statements only once and reuse them in loop
$queryGammes = $pdo->prepare("INSERT INTO Gamme VALUES(?,?);");
$querySSRef = $pdo->prepare("INSERT INTO SS_Ref VALUES(?,?);");
$queryProduits = $pdo->prepare"INSERT INTO Produit
VALUES(?,?,NULL,?,?);");
for ($ligne = fgetcsv($fic, 1024,";"); !feof($fic); $ligne = fgetcsv($fic, 1024,";")) {
$codeArticle = $ligne[0]; //Code Article
$nomArticle = $ligne[1]; //Nom Article
$refGamme = $ligne[2]; //Référence Gamme
$nomGamme = $ligne[3]; //Nom Gamme
$codeSSRef = $ligne[4]; //Code Sous Référence
$libelleSSRef = $ligne[5]; //Libellé Sous Réfé
// execute queries using generated statements, not $pdo directly
$result = $queryGammes->execute(array($refGamme, $nomGamme));
$result = $querySSRef->execute(array($codeSSRef, $libelleSSRef));
$result = $queryProduits->execute(array($codeArticle,$nomArticle,$refGamme,$codeSSRef));
}
}发布于 2017-03-27 10:43:12
核对表:
https://stackoverflow.com/questions/43044027
复制相似问题