Php 使用fgetcsv将数据添加到sql server
今天,使用fgetcsv对我来说是一个全新的功能。我习惯于处理mysql,所以SQLServer也是一种野兽。所以我才转向你们 我有下面的代码,我相信它做了我所需要的一切,除了获取csv并将其放入sql表中 你们能提供一些示例代码来缓解这个问题吗Php 使用fgetcsv将数据添加到sql server,php,sql-server-2008,csv,import,Php,Sql Server 2008,Csv,Import,今天,使用fgetcsv对我来说是一个全新的功能。我习惯于处理mysql,所以SQLServer也是一种野兽。所以我才转向你们 我有下面的代码,我相信它做了我所需要的一切,除了获取csv并将其放入sql表中 你们能提供一些示例代码来缓解这个问题吗 function connect() { if (!function_exists('sqlsrv_num_rows')) { // Insure sqlsrv_1.1 is loaded. die ('sqlsrv_1.1 i
function connect() {
if (!function_exists('sqlsrv_num_rows')) { // Insure sqlsrv_1.1 is loaded.
die ('sqlsrv_1.1 is not available');
}
/*
* Log all Errors.
*/
sqlsrv_configure("WarningsReturnAsErrors", TRUE); // BE SURE TO NOT ERROR ON A WARNING
sqlsrv_configure("LogSubsystems", SQLSRV_LOG_SYSTEM_ALL);
sqlsrv_configure("LogSeverity", SQLSRV_LOG_SEVERITY_ALL);
$conn = sqlsrv_connect('instance', array
(
'UID' => 'userName',
'PWD' => 'password',
'Database' => 'database',
'CharacterSet' => 'UTF-8',
'MultipleActiveResultSets' => true,
'ConnectionPooling' => true,
'ReturnDatesAsStrings' => true,
));
if ($conn === FALSE) {
get_last_error();
}
return $conn;
}
function query($conn, $query) {
$result = sqlsrv_query($conn, $query);
if ($result === FALSE) {
get_last_error();
}
return $result;
}
function execute ( $stmt ) {
$result = sqlsrv_execute($stmt);
if ($result === FALSE) {
get_last_error();
}
return $result;
}
$conn = connect();
if (($handle = fopen(getcwd().'C:\path\TASKS.csv', "r")) !== FALSE) {
while (($data = fgetcsv($handle, 10000, ",")) !== FALSE) {
$db->execute("INSERT INTO Database..table (taskID, name, active) VALUES ('{$data[1]}','{$data[2]}','{$data[3]}')");
set_time_limit(60); // reset timer on loop
}
}
使用上面的代码,我目前得到以下错误
无法打开流:第51行的C:\path\insertDataFGet.php中的参数无效
第51行是$db->execute行
csv示例
1,taskName1,1
2,taskName2,0
3,taskName3,0
下面是我如何在我的一个小导入脚本上实现它的。也许有更好的方法,但这是有效的
if (($handle = fopen(getcwd()."/tmp/updatedpricing.csv", "r")) !== FALSE) {
while (($data = fgetcsv($handle, 10000, ",")) !== FALSE) { // loop through each line of CSV. Returns array of that line each time so we can hard reference it if we want.
$db->execute("UPDATE table SET col1='{$data[1]}',col2='{$data[2]}',col3='{$data[3]}' WHERE something=something",ENABLE_DEBUG);
set_time_limit(60); // reset timer on loop
}
}
fclose($handle);
这段代码只是一个例子
直接在代码中实现有两个问题:首先是getcwd(),在您的情况下,您不需要使用它,因为我使用虚拟路径和动态创建的“ln-s”,所以我的工作目录并不总是相同的,文件也不总是在同一位置。因为你知道确切的路径,你可以直接把路径放进去
if (($handle = fopen('C:\path\TASKS.csv', "r")) !== FALSE) {
第二个问题是不能复制和粘贴我的sql语句,因为它依赖于我的自定义mysql db访问类。因此,您必须更改以$db->execute
开头的行,以使用可用的mysql函数。如果您正在执行一个基本的插入,我想您可以单独构建查询,然后通过query()
或execute()
函数传递查询,这两个函数都可以工作。不要忘记正确指定表名,因为您在示例代码中写入的表名是错误的
第三个问题是,您需要确保正确地转义输入变量
$data[]
等,并确保将CSV中的列与插入列匹配不要忘记$data
将从0(零)开始计数您遇到了什么问题?显示您尝试的代码,解释它是如何工作的,有人会帮助您修复它。10000在fgetcsv($handle,10000,“,”)
中做什么。我读了手册,我可以说它与长度有关,但你不是第一个有10k的人,所以我告诉它以不超过10000字节/千字节的行进行阅读,我不确定我知道在我的例子中,csv的字符数永远不会超过40个,所以我可以在固定长度的行中进行阅读。如果它是一个可变长度的输入行,例如产品描述,您可能需要使用一个小的行长度计算来给出您试图读取的行的实际长度,并将该实际长度传递给fgetcsv(),而不是固定长度,因为我遇到了一个错误。我已对我的原稿进行了编辑。你能帮我度过这一关吗?你是个救命恩人。谢谢你的帮助。我真的很感激。我90%确信我拥有的功能适用于sql server。我删掉了表名、用户名等。它们在我的剧本中是准确的。我可以把while循环$params=array({$data[1]},{$data[2]},{$data[3]})放在里面吗
要从csv的每一行获取数据吗?是的,在循环中读取csv的每一行都将显示为$data,这是一个数组,因此您只需使用[0]…[x]等引用列。无需将$data重新定义为$params,因为您只需将$data传递回查询函数,然后忽略不需要的列。记住$data是一个数组。您还可以使用count($data)获取列计数,然后在主线循环中执行一些智能验证/任何操作。这完全取决于你和你的需要。我的例子只是基本的。