【问题标题】:PHP PDO MySQL get entries from Access and INSERT into MySQLPHP PDO MySQL 从 Access 和 INSERT 获取条目到 MySQL
【发布时间】:2014-03-12 23:41:23
【问题描述】:

我的目标是将本地 MS Access 数据库复制到我的 MySQL 数据库中(使用 php PDO)

MS Access 数据库位于网络共享驱动器上,每 6 小时更新一次新条目。

在下面的代码中,我从 MySQL 表“production_schedule”中检索了最大 ID 号,然后建立了一个 ODBC 连接以从 MS ACCESS 数据库中检索大于最大 ID 号的所有条目。

但现在我不知道如何将这些新条目插入 MySQL 表“production_schedule”。

有人可以帮忙吗?

<?php

/*USING XAMPP*/

$dsn = "mysql:host=localhost;dbname=qmsdb;charset=utf8";
$uname = "root";
$pword = "";

$db = null;
$limit = 10;
$counter = 0;

while (true) {
try {
    $db = new PDO($dsn, $uname, $pword);
    $db->exec( "SET CHARACTER SET utf8" );
    $db->setAttribute( PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC ); 
    $db->setAttribute( PDO::ATTR_PERSISTENT, true );
    break;
}
    catch (Exception $e) {
        $db = null;
        $counter++;
        if ($counter == $limit)
            throw $e;
    }
}

$aid = $db->prepare("SELECT MAX(id) FROM production_schedule");
$aid->execute();
$big_id = $aid->fetchColumn();
$refid = intval($big_id);


$conn=odbc_connect('Prod_Schedule','','');
if (!$conn) {
    exit("Connection Failed: " . $conn);
}

$sql="SELECT * FROM Schedule WHERE ID > $refid";
$rs=odbc_exec($conn,$sql);
if (!$rs) {
    exit("Error in SQL");
}

***** INSERT CODE TO PUT THESE MS ACCESS ENTRIES INTO THE MYSQL TABLE ******
?>

【问题讨论】:

    标签: php mysql ms-access pdo odbc


    【解决方案1】:

    可能是这样的:

    while(odbc_fetch_row($rs)){
    
        $sql = "INSERT INTO production_schedule (fieldName1, fieldName2, fieldName3) VALUES (?, ?, ?)";
        $stmt = $dbh->prepare($sql);
    
        for($i=1;$i<=odbc_num_fields($rs);$i++){
            $stmt->bindValue($i, odbc_result($rs,$i));
        }
    
        $stmt->execute();   
    }
    

    注意:取决于您必须转储多少数据,您应该使用这样的解决方案:PDO Prepared Inserts multiple rows in single query 以降低 PHP 超时的风险。

    【讨论】:

    • production_schedule 之后的“VALUES”是否属于那里?
    • 你把VALUES (?, ?, ?)放在哪里。我真的需要打问号还是给它一个名字?我问的原因是因为我收到了错误:Invalid parameter number: number of bound variables does not match number of tokens
    • 没关系。我在其他地方出错了。谢谢你。这很好用
    【解决方案2】:

    我刚刚测试了以下代码,它似乎对我来说没问题:

    $dsn = "mysql:host=localhost;port=3307;dbname=myDb;charset=utf8";
    $uname = "root";
    $pword = "whatever";
    $mysqlDb = new PDO($dsn, $uname, $pword);
    $mysqlDb->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $mysqlSql = "INSERT INTO clients (LastName, FirstName) VALUES (?, ?)";
    $mysqlCmd = $mysqlDb->prepare($mysqlSql);
    $LastName = '';
    $FirstName = '';
    $mysqlCmd->bindParam(1, $LastName, PDO::PARAM_STR, 255);
    $mysqlCmd->bindParam(2, $FirstName, PDO::PARAM_STR, 255);
    
    $connStr = 
            'Driver={Microsoft Access Driver (*.mdb, *.accdb)};' .
            'Dbq=C:\\Users\\Public\\Database1.accdb;';
    $accessDb = odbc_connect($connStr, "", "");
    $accessSql = "SELECT LastName, FirstName FROM Clients";
    $accessResult = odbc_exec($accessDb, $accessSql);
    while ($accessData = odbc_fetch_array($accessResult)) {
        $LastName = $accessData["LastName"];
        $FirstName = $accessData["FirstName"];
        $mysqlCmd->execute();
    }
    

    【讨论】:

      【解决方案3】:

      首先创建一个函数将值插入 MySQL,然后循环遍历 ODBC 结果;

      function createProductionSchedule($company,$person,$order){
      
      $mysqli_con=mysqli_connect(DBHOST,DBUSER,DBPASS,DBNAME);
      
      if (mysqli_connect_errno($mysqli_con))
        {
        echo 'Failed to connect to MySQL';
        }
      
      //Obviously your own fields here
      $company = mysqli_real_escape_string($mysqli_con, $company);
      $person = mysqli_real_escape_string($mysqli_con, $person);
      $order = mysqli_real_escape_string($mysqli_con, $order);
      
      $sql = "INSERT INTO production_schedule VALUES ('$company','$person','$order')";
      
      mysqli_query($mysqli_con, $sql);
      
      return mysqli_insert_id($mysqli_con);
      
      mysqli_close($mysqli_con);
      }
      

      然后在你的代码部分

      while (odbc_fetch_row($rs))
        {
        $company=odbc_result($rs,"Company");
        $person=odbc_result($rs,"Person");
        $order=odbc_result($rs,"Order");  
        //Call the function to insert the record    
        createProductionSchedule($company,$person,$order);
      
        }
      
      
      odbc_close($conn);
      

      【讨论】:

      • 你有 PDO 版本吗?
      • +1 用于尝试使答案与问题中的数据库结构相匹配。 -1 表示将 SQL 语句“粘合在一起”。准备好的语句会是一个更好的例子。
      猜你喜欢
      • 2013-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-26
      • 1970-01-01
      • 1970-01-01
      • 2013-12-28
      • 2012-01-03
      相关资源
      最近更新 更多