我有以下pdo查询将csv上传到mysql:
private function loadRecurringData ( $filepath, $table )
{
//We are going to insert some data into the users table
$sth = $this->dbcon->prepare(
"INSERT INTO " . $table . "(cust_acc, cli, charge_date, quantity, wholesale_cost, charge_code,description, retail)
VALUES (:cust_acc, :cli, :charge_date, :quantity, :wholesale_cost, :charge_code, :description,
(select retail_cost from vw_charge_templates where vw_charge_templates.charge_code = :charge_code))"
);
$csv = \League\Csv\Reader::createFromPath( $filepath );
$nbInsert = $csv->each(function ($row) use (&$sth) {
//Do not forget to validate your data before inserting it in your database
$sth->bindValue(':cust_acc', $row[0], \PDO::PARAM_STR);
$sth->bindValue(':cli', $row[1], \PDO::PARAM_STR);
$sth->bindValue(':charge_date', $row[2], \PDO::PARAM_STR);
$sth->bindValue(':quantity', $row[4], \PDO::PARAM_STR);
$sth->bindValue(':wholesale_cost', $row[5], \PDO::PARAM_STR);
$sth->bindValue(':charge_code', $row[6], \PDO::PARAM_STR);
$sth->bindValue(':description', $row[7], \PDO::PARAM_STR);
return $sth->execute(); //if the function return false then the iteration will stop
});
}
当第二个表中存在费用代码时,它工作正常,但我需要它在返回false时完成循环,以便我可以加载整个文档并稍后检查缺少的信息。我已经尝试了各种情况,if / else语句而不是ins,但我不能正确地使用语法,它总是停在我的虚假代码上。
请帮忙
编辑:
我认为存在误解。这是应该的过程:
1:PHP将文件上传到循环中并写入准备好的语句。
2:每次迭代时子查询
select retail_cost from vw_charge_templates where vw_charge_templates.charge_code = :charge_code
查找表中已加载文件中的当前费用代码(vw_charge_templates),并从该行中选择要插入此查询的费率
3:查询很满意并将所有数据插入$ table。
如果子查询可以在第二个表中找到charge_code,这可以正常工作,例如该文件包含收费代码'ABC',它在tbale中找到'ABC',每个人都很高兴。
如果存在charge_code,这将迭代尽可能多的行。
如果我组成一个代码'xyz'而不管csv上的哪一行我把它迭代将停止因为循环返回false(因为它是设计 - 而不是我)这个cna是第7行,或者第345行并且它完美地插入了所有行。
我需要的是子查询中的条件,以检查第二个表中的charge_code,如果代码不存在则替换值。这是关于子查询的问题,而不是循环。