首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PDO请求工作1/4次

PDO请求工作1/4次
EN

Stack Overflow用户
提问于 2017-03-27 10:33:18
回答 3查看 57关注 0票数 1

为了解释上下文,我有一个CSV文件来循环。

我已经用下面的代码检查过了,实际上我已经准备好了CSV文件的每一行。

代码语言:javascript
复制
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++时:

代码语言:javascript
复制
$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中。

有什么建议吗?我真的被困在这里了,这很重要,所以我会接受任何建议。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-03-27 14:10:40

对于我得到的每一个答案,我找到了一个解决方案,首先我使用了@maxpovver (我粘贴了他给出的got )和@Chris建议的参数化查询。

Thx到@lvaro González和“您的常识”我成功地打印了PDO错误,这告诉我特殊字符有一些问题。将PDO字符集设置为utf8并不足以改变入口的问题,但它解决了退出时的问题:当我从DB中检索特殊字符时,会很好地打印它们。

为了解决这个问题,我必须使用utf8_encode php函数:

代码语言:javascript
复制
$result = $queryGammes->execute(array(
    "refGamme"=> $refGamme, 
    "nomGamme"=> utf8_encode($nomGamme))
);
票数 0
EN

Stack Overflow用户

发布于 2017-03-27 10:53:17

我几乎可以肯定,由于将值直接插入到sql中,所以会出现问题。下面是你应该做的事情:

代码语言:javascript
复制
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));
     }
}

您也可以在不使用命名参数的情况下完成它,但我不建议这样做,因为这些代码的可读性较低(以后更难记住它做了什么):

代码语言:javascript
复制
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));
     }
}
票数 2
EN

Stack Overflow用户

发布于 2017-03-27 10:43:12

核对表:

  1. 你没有清理你的投入,所以这是我首先要看的地方。最有可能且健壮的修复方法是切换到PDO的参数化查询语法。
  2. 现在,假设没有解决问题,下一步是仔细观察插入的行与不插入的行。我将选择插入的前几行,并将它们与不插入的行进行比较。
  3. 我会考虑一些独特的限制。这里的违规行为可能会在MySQL日志中抛出消息。所以先检查一下。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43044027

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档