magento导入csv文件到数据库脚本
这是magento脚本的另外一种写法。
个人觉得写的还行,高手莫见笑。
用SplFileObject来处理大数据的csv文件效率高
代码如下 | 复制代码 |
<?php require_once 'shell/abstract.php'; class Faarao_Import_Customer extends Mage_Shell_Abstract { protected $_files = array(); protected $_datas = array(); public function __construct() { parent::__construct(); set_time_limit(0); if($this->getArg('file')) { $this->_files = array_merge( $this->_files, array_map( 'trim', explode(',', $this->getArg('file')) ) ); foreach ($this->_files as $key=>$file) { $extension = self::get_extension($file); if($extension != 'csv'){ unset($this->_files[$key]); } } } if(empty($this->_files)){ die(self::usageHelp()); } } // Shell script point of entry public function run() { self::getDataFromCsv(); if(empty($this->_datas)){ die("not found data in csv ! \r\n"); } $emailBooks = array(); foreach ($this->_datas as $name => $datas) { echo "filename: {$name} =======================\r\n"; $importNum = 0; foreach ($datas as $key => $data) { if(empty(trim($data[4]))){ continue; } $customerData['firstname'] = trim($data[0]); $customerData['lastname'] = trim($data[1]); $customerData['phone'] = trim($data[2]); $customerData['mobile'] = trim($data[3]); $customerData['email'] = trim($data[4]); $customerData['company'] = trim($data[5]); $customerData['billing_address'] = $data[6] . $data[7] . $data[8]; $customerData['billing_postcode'] = sprintf("%05d",trim($data[9])); $customerData['billing_city'] = trim($data[10]); $customerData['billing_country'] = trim($data[11]); $customerData['shipping_address'] = $data[12] . $data[13] .$data[14]; if(empty($data[15]) && is_numeric($data[16])){ $customerData['shipping_postcode'] = sprintf("%05d",trim($data[16])); $customerData['shipping_city'] = trim($data[17]); $customerData['shipping_country'] = trim($data[18]); }else{ $customerData['shipping_postcode'] = sprintf("%05d", trim($data[15]));; $customerData['shipping_city'] = trim($data[16]); $customerData['shipping_country'] = trim($data[17]); } // $customerData['email'] = 'zouhongzhao@126.com'; $customerData['country'] = 'Finland'; $customerData['password'] = self::randomkeys(10); echo "customer email {$customerData['email']} ...\r\n"; print_r($customerData); $customer = Mage::getModel('customer/customer'); $customer->setWebsiteId(Mage::app()->getWebsite()->getId()); $customer->loadByEmail($customerData['email']); if(!$customer->getId()) { echo "insert ... \r\n"; $customer->setEmail($customerData['email']); $customer->setFirstname($customerData['firstname']); $customer->setLastname($customerData['lastname']); $customer->setPassword($customerData['password']); }else{ echo "update ... \r\n"; } try { $customer->save(); $customer->setConfirmation(null); $customer->save(); //Make a "login" of new customer Mage::getSingleton('customer/session')->loginById($customer->getId()); $importNum ++; $emailBooks[$customerData['email']] = array( 'firstname'=>$customerData['firstname'], 'lastname'=>$customerData['lastname'], 'customer_mage_id'=>$customer->getId(), 'passwd'=>$customerData['password'] ); echo "customer save ok !\r\n"; } catch (Exception $ex) { echo "customer save fail !\r\n"; continue; } if(trim($customerData['billing_address']) == trim($customerData['shipping_address']) && $customerData['billing_postcode'] == $customerData['shipping_postcode'] && $customerData['billing_city'] == $customerData['shipping_city']){ $same_address = array ( 'firstname' => $customerData['firstname'], 'lastname' => $customerData['lastname'], 'street' => $customerData['billing_address'], 'company' => $customerData['company'], 'city' => $customerData['billing_city'], 'region_id' => '', 'region' => '', 'postcode' => $customerData['billing_postcode'], 'country_id' => 'FI', 'telephone' => $customerData['phone'], ); $customAddress = Mage::getModel('customer/address'); //$customAddress = new Mage_Customer_Model_Address(); $customAddress->setData($same_address) ->setCustomerId($customer->getId()) ->setIsDefaultBilling('1') ->setIsDefaultShipping('1') ->setSaveInAddressBook('1'); try { $customAddress->save(); echo "sameAddress save ok !\r\n"; } catch (Exception $ex) { echo "sameAddress save fail !\r\n"; continue; } }else{ $billing_address = array ( 'firstname' => $customerData['firstname'], 'lastname' => $customerData['lastname'], 'street' => $customerData['billing_address'], 'company' => $customerData['company'], 'city' => $customerData['billing_city'], 'region_id' => '', 'region' => '', 'postcode' => $customerData['billing_postcode'], 'country_id' => 'FI', 'telephone' => $customerData['phone'], ); self::setBillingAddress($billing_address,$customer); $shipping_address = array ( 'firstname' => $customerData['firstname'], 'lastname' => $customerData['lastname'], 'street' => $customerData['shipping_address'], 'company' => $customerData['company'], 'city' => $customerData['shipping_city'], 'region_id' => '', 'region' => '', 'postcode' => $customerData['shipping_postcode'], 'country_id' => 'FI', 'telephone' => $customerData['phone'], ); self::setShippingAddress($shipping_address,$customer); } // die; } echo "import num: {$importNum} =======================\r\n"; } //save passwd $fp = fopen('customer_record.log', 'w'); fwrite($fp, json_encode($emailBooks)); fclose($fp); } public function setBillingAddress($data,$customer){ $customerAddress = Mage::getModel('customer/address'); if ($defaultShippingId = $customer->getDefaultBilling()){ $customerAddress->load($defaultShippingId); } else { $customerAddress ->setCustomerId($customer->getId()) ->setIsDefaultBilling('1') ->setSaveInAddressBook('1') ; $customer->addAddress($customerAddress); } try { $customerAddress ->addData($data) ->save() ; echo "BillingAddress save ok !\r\n"; } catch(Exception $e){ // Mage::log('Address Save Error::' . $e->getMessage()); echo "BillingAddress save fail !\r\n"; } } public function setShippingAddress($data,$customer){ $customerAddress = Mage::getModel('customer/address'); if ($defaultShippingId = $customer->getDefaultShipping()){ $customerAddress->load($defaultShippingId); } else { $customerAddress ->setCustomerId($customer->getId()) ->setIsDefaultShipping('1') ->setSaveInAddressBook('1') ; $customer->addAddress($customerAddress); } try { $customerAddress ->addData($data) ->save() ; echo "ShippingAddress save ok !\r\n"; } catch(Exception $e){ // Mage::log('Address Save Error::' . $e->getMessage()); echo "ShippingAddress save fail !\r\n"; } } public function randomkeys($length) { $returnStr=''; $pattern = '1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLOMNOPQRSTUVWXYZ'; for($i = 0; $i < $length; $i ++) { $returnStr .= $pattern {mt_rand ( 0, 61 )}; } return $returnStr; } public function getDataFromCsv(){ $this->_files = array_unique($this->_files); $csvCustomers = array(); foreach ($this->_files as $filename) { echo "current file: {$filename}\r\n"; setlocale(LC_ALL, 'en_US.UTF-8'); $content = file_get_contents($filename); $data = mb_detect_encoding()($content, 'UTF-8', true); // $data = iconv("CP1257","UTF-8", $content); file_put_contents($filename, $content); // fclose($handle); // print_r($content);die; $basename = basename($filename,".csv"); $data = array(); $tmp = array(); $spl_object = new SplFileObject($filename, 'rb'); $spl_object->seek(filesize($filename)); $start = 0; $num = $spl_object->key(); $spl_object->seek($start); while ($num-- && !$spl_object->eof()) { $data[] = $spl_object->fgetcsv(); $spl_object->next(); } foreach ($data as $key => $values) { if($key == 0){ continue; } $mergeValue = explode(';',implode(';', $values)); // if(count($mergeValue) != 20){ // continue; // } array_push($tmp,$mergeValue); } $this->_datas[$basename] = $tmp; } return $this; } public function get_extension($filename){ return pathinfo($filename,PATHINFO_EXTENSION); } // Usage instructions public function usageHelp() { return <<<USAGE Usage: php tetuan_customer_import.php --file a.csv,b.csv \n USAGE; } } // Instantiate $shell = new Faarao_Import_Customer(); // Initiate script $shell->run(); |
补充:有一些朋友使用的是excel文档,这样这个程序就不可以使用了,我们可以使用phpexcel插件来读取excel文件并写入到数据库中去哦。
微信公众号开发代码我在网上看到了有不少,其实都是大同小义了都是参考官方给出的demo文件进行修改的,下面给各位分享一个。初次接触的时候写的一些,有点乱…也没去整理…
ps–最近都不想工作了,各种烦,午饭也没吃,就是想表达一下我过的不好。–请忽略个人情绪往下看。
代码如下 | 复制代码 |
<?php * |
PHP倒是自带了生成唯一id的函数:uniqid() ,它是基于当前时间微秒数的,用法如下:
代码如下 | 复制代码 |
echo uniqid(); //13位的字符串 echo uniqid("php_"); //当然你可以加上前缀 echo uniqid("php_", TRUE); //如果第二个参数more_entropy为true则生成23位 |
字符串
但是它生成的标识有可能不是唯一的,所以很多人会:
代码如下 | 复制代码 |
<?php |
例子。
代码如下 | 复制代码 |
<? //sha1()函数, "安全散列算法(SHA1)" function create_unique() { //return $data; } 例子如下: <? |
我看到很多人使用 md5() 函数,即使它并不完全意味着这个目的:
代码如下 | 复制代码 |
// generate unique string There is actually a PHP function named uniqid() that is meant to be used for this. // generate unique string // generate another unique string |
你可能会注意到,尽管字符串是唯一的,前几个字符却是类似的,这是因为生成的字符串与服务器时间相关。
但实际上也存在友好的一方面,由于每个新生成的 ID 会按字母顺序排列,这样排序就变得很简单。
为了减少重复的概率,你可以传递一个前缀,或第二个参数来增加:
代码如下 | 复制代码 |
// with prefix // with more entropy // both |
这个函数将产生比 md5() 更短的字符串,节省一些空间。
php生成全球唯一标识符(GUID)的方法
GUID在空间上和时间上具有唯一性,保证同一时间不同地方产生的数字不同。
世界上的任何两台计算机都不会生成重复的 GUID 值。
需要GUID的时候,可以完全由算法自动生成,不需要一个权威机构来管理。
GUID的长度固定,并且相对而言较短小,非常适合于排序、标识和存储。
代码如下 | 复制代码 |
<?php return $uuid; |
pHP中try{}catch{}语句
PHP 5 添加了类似于其它语言的异常处理模块。在 PHP 代码中所产生的异常可被 throw语句抛出并被 catch 语句捕获。(注:一定要先抛才能获取)
需要进行异常处理的代码都必须放入 try 代码块内,以便捕获可能存在的异常。
每一个 try 至少要有一个与之对应的 catch。
使用多个 catch可以捕获不同的类所产生的异常。
当 try 代码块不再抛出异常或者找不到 catch 能匹配所抛出的异常时,PHP 代码就会在跳转到最后一个 catch 的后面继续执行。
当然,PHP允许在 catch 代码块内再次抛出(throw)异常。
当一个异常被抛出时,其后(译者注:指抛出异常时所在的代码块)的代码将不会继续执行,而 PHP 就会尝试查找第一个能与之匹配的 catch。
如果一个异常没有被捕获,而且又没用使用 set_exception_handler() 作相应的处理的话,那么 PHP 将会产生一个严重的错误,并且输出 Uncaught Exception ... (未捕获异常)的提示信息。
先来看一下PHP内置异常类的基本属性和方法。(不包括具体实现)
代码如下 | 复制代码 |
try{ } catch(){ throw new Exception(); } catch(){ //这里可以捕获到前面一个块抛出的Exception } |
为了进一步处理异常,我们需要使用PHP中try{}catch{}----包括Try语句和至少一个的catch语句。任何调用 可能抛出异常的方法的代码都应该使用try语句。Catch语句用来处理可能抛出的异常。以下显示了我们处理getCommandObject()抛出的异常的方法:
代码如下 | 复制代码 |
< ?php try { $mgr = new CommandManager(); $cmd = $mgr->getCommandObject("realcommand"); $cmd->execute(); } catch (Exception $e) { print $e->getMessage(); exit(); } ?> |
可以看到,通过结合使用throw关键字和PHP中try{}catch{},我们可以避免错误标记“污染”类方法返回的值。因为“异常”本身就是一种与其它任何对象不同的PHP内建的类型,不会产生混淆。
如果抛出了一个异常,try语句中的脚本将会停止执行,然后马上转向执行catch语句中的脚本。
例子如下:
包含文件错误抛出异常
代码如下 | 复制代码 |
<?php
|
如果异常抛出了却没有被捕捉到,就会产生一个fatal error。
多个catch捕获多个异常
PHP将查询一个匹配的catch代码块。如果有多个catch代码块,传递给每一个catch代码块的对象必须具有不同类型,这样PHP可以找到需要进入哪一个catch代码块。当try代码块不再抛出异常或者找不到catch能匹配所抛出的异常时,PHP代码就会在跳转最后一个catch的后面继续执行。多个异常的捕获的示例如下:
代码如下 | 复制代码 |
<?php |
在上面的代码中,可以使用两个异常处理类:一个是自定义的异常处理类MyException;另一个则是PHP中内置的异常处理类Exception。分别在try区块中创建测试类TestException的对象,并根据构造方法中提供的不同数字参数,抛出自定义异常类对象、内置的异常类对象和不抛出任何异常的情况,跳转到对应的catch区块中执行。如果没有异常发生,则不会进入任何一个catch块中执行,测试类TestException的对象创建成功
清除变量中字符中的空格我们有几种方法,因为很多时候我们使用trim是无法删除了,下面整理了几个方法,大家可参考一下。在PHP里,我们要清除变量当中的空格,先来看下面的这一种方法:
代码如下 | 复制代码 |
$arr = explode(" ",$a); |
另外还有一种方法如下:
代码如下 | 复制代码 |
$str=str_replace(" ","",$str); |
上面的方法只能处理英文空格的情况.
下面的方法可以处理中文只的空格,不过有个情况是如果页面指定了编码的话会出现乱码
代码如下 | 复制代码 |
$str=str_replace(chr(32),"",$str); |
对于页面为UTF-8是,中文空格提交后变成了chr(227),原应为chr(161)
后面测试了使用trim(), ltrim(), rtrim()函数也可以达到我们要的效果
下面将介绍trim()系统函数的语法和使用:
string trim(string $str [, string $charlist])
trim()函数对输入的字符串进行去除开始位置和结束位置的空格(其实不只是空格)。
如果不设置第二个参数,trim()函数将会去除以下字符:
” ” : 空格;
“\t”: 制表符;
“\n”: 换行符;
“\r”: 回车符;
“\0″: 空字符;
“\x0B”: 垂直制表符;
如果设置第二个参数,trim()函数将只去除第二个参数中的字符集,而不会再去除上面默认的字符集。
代码如下 | 复制代码 |
1 <?php 2 $str = " hello world "; 3 $str_trim = trim($str); 4 echo "$str<br />$str_trim"; 5 ?> 看一下输出结果: hello world hello world |
怎么是一样的呢?第一行的空格怎么不见了。呵呵。我们在看一下网页的HTML代码吧:
hello world hello world
空格出现了吧!空格不见是因为浏览器显示时自动进行不显示多除的空格。
代码如下 | 复制代码 |
1 <?php 2 $str = "Left hello world Right "; 3 $str_trim = trim($str,"eftL"); 4 echo "$str<br />$str_trim"; 5 ?> 输出结果为: Left hello world Right hello world Right |
我们将左则和eftL字符相关的都去除了,你可能注意到了,右侧的Right中的”t”也在第二个参数中,为什么没去除。仔细看一下$str最后一个字符,其实是空格。因为空格(最右侧)没有去除(在HTML中能看见),所以”t”(右侧倒数第二)将不会处理。这同时说明函数第二个参数会覆盖trim()的默认字符集。
最后说一下ltrim()和rtrim()函数:
ltrim()函数只处理字符串的左侧;
rtrim()函数只处理字符串的右侧;
通过正则表达式替换,功能更强
php去除字符串首尾空格(包括全角)
代码如下 | 复制代码 |
<? |
相关文章
- 操作类就是把一些常用的一系列的数据库或相关操作写在一个类中,这样调用时我们只要调用类文件,如果要执行相关操作就直接调用类文件中的方法函数就可以实现了,下面整理了...2016-11-25
- 本文给大家分享C#连接SQL数据库和查询数据功能的操作技巧,本文通过图文并茂的形式给大家介绍的非常详细,需要的朋友参考下吧...2021-05-17
- 这篇文章主要介绍了C#从数据库读取图片并保存的方法,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下...2021-01-16
- 这篇文章主要介绍了Intellij IDEA连接Navicat数据库的方法,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借价值,需要的朋友可以参考下...2021-03-25
- 在开发过程中,我们经常会将日期时间的毫秒数存放到数据库,但是它对应的时间看起来就十分不方便,我们可以使用一些函数将毫秒转换成date格式。 一、 在MySQL中,有内置的函数from_unixtime()来做相应的转换,使用如下: 复制...2014-05-31
- C#使用System.IO中的文件操作方法在Windows系统中处理本地文件相当顺手,这里我们还总结了在Oracle中保存文件的方法,嗯,接下来就来看看整理的C#操作本地文件及保存文件到数据库的基本方法总结...2020-06-25
- 通过内网连另外一台机器的mysql服务, 确发现速度N慢! 等了大约几十秒才等到提示输入密码。 但是ping mysql所在服务器却很快! 想到很久之前有过类似的经验, telnet等一些服务在连接请求的时候,会做一些反向域名解析(如果...2015-10-21
- 某些时候,例如为了搭建一个测试环境,或者克隆一个网站,需要复制一个已存在的mysql数据库。使用以下方法,可以非常简单地实现。假设已经存在的数据库名字叫db1,想要复制一份,命名为newdb。步骤如下:1. 首先创建新的数据库newd...2015-10-21
- mysqldump命令的用法1、导出所有库系统命令行mysqldump -uusername -ppassword --all-databases > all.sql 2、导入所有库mysql命令行mysql>source all.sql; 3、导出某些库系统命令行mysqldump -uusername -ppassword...2015-10-21
- 1005:创建表失败1006:创建数据库失败1007:数据库已存在,创建数据库失败1008:数据库不存在,删除数据库失败1009:不能删除数据库文件导致删除数据库失败1010:不能删除数据目录导致删除数据库失败1011:删除数据库...2013-09-23
- 这篇文章主要介绍了c#从数据库里取得数据并异步更新ui的方法,大家参考使用吧...2020-06-25
- yii2.0框架是PHP开发的一个比较高效率的框架,集合了作者的大量心血,下面通过用户为例给大家详解yii2使用中的一些基本的增删改查操作。 User::find()->all(); //返回所有用户数据; User::findOne($id); //返回 主键...2015-11-24
- 1.用phpmyadmin创建数据库和数据表 创建数据库的时候,请将“整理”设置为:“utf8_general_ci” 或执行语句: 复制代码 代码如下:CREATE DATABASE `dbname` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; 创...2015-10-21
- 这篇文章主要介绍了springBoot 项目排除数据库启动方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-09-10
- 这篇文章主要介绍了Linux 下使用shell脚本定时维护数据库,本文通过案例分析给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-07-11
详解在IDEA中将Echarts引入web两种方式(使用js文件和maven的依赖导入)
这篇文章主要介绍了在IDEA中将Echarts引入web两种方式(使用js文件和maven的依赖导入),本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-07-11- 这篇文章主要介绍了node.js如何操作MySQL数据库,帮助大家更好的进行web开发,感兴趣的朋友可以了解下...2020-10-29
- “主机,用户名,密码”得到连接、“数据库,sql,连接”得到结果,最后是结果的处理显示。当然,数据库连接是扩展库为我们完成的,我们能做的仅仅是处理结果而已。...2013-09-29
- 对数据加密分两种,一种是对数据库本身进行加密,另一种是对数据表中的数据进行加密,下面通过本文给大家介绍C#连接加密的Sqlite数据库的方法,感兴趣的朋友一起看看吧...2020-06-25
- 这篇文章主要介绍了Java连接数据库oracle中文乱码解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-05-16