gpt4 book ai didi

php 从 csv 中获取数据并再次将它们写入同一个 csv

转载 作者:行者123 更新时间:2023-11-30 22:12:02 24 4
gpt4 key购买 nike

我有一个这样的csv

product_id,stock_unit
1, ,
2, ,
3, ,
4, ,
5, ,
6, ,

现在在我的 php 代码中,我将获取产品 ID 并运行对数据库的查询以从数据库中获取库存单位。获取产品的库存单位后,脚本应将其更新为 csv,而不更改任何名称。

所以尽管如此,我还是这样编写了我的代码

<?php
$mysqli = new mysqli("localhost", "username", "password", "database");

/* check connection */
if ($mysqli->connect_errno) {
printf("Connect failed: %s\n", $mysqli->connect_error);
exit();
}

$file = "update_pd.csv";
$csv = array_map("str_getcsv", file($file,FILE_SKIP_EMPTY_LINES));
$keys = array_shift($csv);

$stock_array = array();
if (($handle = fopen($file, "r")) !== FALSE) {
fgetcsv($handle);
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
$stock_array[] = get_data($data[0]);
}
fclose($handle);
}
//print_r($stock_array);
$handle = fopen("update_pd.csv", "a");
fputcsv($handle, $stock_array);


function get_data($id) {
if( !empty($id) ) {
$result = $mysqli->query("SELECT `stock_unit` FROM `products` WHERE `product_id` = ".$id." ");
if( $result ) {
while($row = $result->fetch_assoc()) {
return $row['stock_unit'];
}
}
}
}

这里是覆盖 csv 我的意思是数据在最后一行写入,所有旧数据都存在。脚本应根据 csv 文件中的产品 ID 写入库存数量,而 csv 标题和文件名没有任何变化。那么有人可以告诉我该怎么做吗?任何帮助和建议都将非常感激。

更新

因为库存单位将从数据库中获取。输出应该是这样的

product_id,stock_unit
1, 24,
2, 22,
3, 37,
4, 46,
5, 89,
6, 96,

最佳答案

如果我没听错,您的代码可以正常工作,但会附加数据而不是覆盖文件。这是因为你在做:

$handle = fopen("update_pd.csv", "a");

这将以追加模式打开文件。要覆盖它,您需要以写入模式打开它,例如

$handle = fopen("update_pd.csv", "w");

请参阅 PHP Manual for fopen 中的 mode 参数说明

'w' - Open for writing only; place the file pointer at the beginning of the file and truncate the file to zero length. If the file does not exist, attempt to create it.

'a' - Open for writing only; place the file pointer at the end of the file. If the file does not exist, attempt to create it. In this mode, fseek() has no effect, writes are always appended.

但是,您在 get_data 函数中使用了 $mysqli 变量,但该变量未在该范围内定义,因此它根本不起作用。确保将变量传递给函数,例如

function get_data($mysqli, $id) {

然后这样调用它:

get_data($mysqli, $data[0]);

但是,如果您有一个基本相同的查询,只是在 WHERE 子句中使用了不同的值,则使用 Prepared Statements 可以加快查询执行速度.

在创建 mysqli 实例后在全局范围内定义它:

$query = $mysqli->prepare(
"SELECT `stock_unit` FROM `products` WHERE `product_id` = ?
);

然后不是将 $mysqli 变量传递给 get_data,而是传递 $query 变量。将 get_data 函数更改为以下代码:

function get_data($query, $id) {
if( !empty($id) ) {
$query->bind_param("i", $id);
$result = $query->execute($query);


作为替代方案,不要单独获取库存单位,而是考虑执行以下操作:

$file = "file.csv";
$data = array_map('str_getcsv', file($file, FILE_SKIP_EMPTY_LINES));
$ids = array_filter(array_column($data, 0), 'is_numeric');
$ids = implode(',', $ids);

然后使用 WHERE … IN 在一个查询中完成所有操作和 INTO OUTFILE :

SELECT "product_id", "stock_unit"
UNION ALL
SELECT product_id, stock_unit
FROM products
WHERE product_id IN ($ids)
INTO OUTFILE '/path/to/update_pd.csv'
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY ',\n';

请注意,由于 SQL 注入(inject)攻击的风险,将变量插入查询中是一种不好的做法。但是因为我们确保 id 是数字,所以在这种情况下没问题。另外,mysqli does not allow easy binding of values in WHERE … IN queries .

关于php 从 csv 中获取数据并再次将它们写入同一个 csv,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39788739/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com