学员问题:
比如我要删除表里最后一条数据,试了好几个都语法错误,我用的是phpmyadmin。 |
徐多蔚老师给出的解决方案格式:
delete a from infos a,(select max(id) id from infos) b where a.id = b.id; max最后一个id
delete a from infos a,(select min(id) id from infos) b where a.id = b.id; min获得第一个id
联系方式[微信]:徐多蔚15309695130 感恩有您的陪伴,我们用心服务每一位客户 – 徐多蔚 xuduowei
学员问题:
比如我要删除表里最后一条数据,试了好几个都语法错误,我用的是phpmyadmin。 |
徐多蔚老师给出的解决方案格式:
delete a from infos a,(select max(id) id from infos) b where a.id = b.id; max最后一个id
delete a from infos a,(select min(id) id from infos) b where a.id = b.id; min获得第一个id
来源:https://baike.baidu.com/item/GIT/12647237?fr=aladdin
Git是一款免费、开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。[1] Git的读音为/gɪt/。
Git是一个开源的分布式版本控制系统,可以有效、高速的处理从很小到非常大的项目版本管理。[2] Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。
Torvalds 开始着手开发 Git 是为了作为一种过渡方案来替代 BitKeeper,后者之前一直是 Linux 内核开发人员在全球使用的主要源代码工具。开放源码社区中的有些人觉得BitKeeper 的许可证并不适合开放源码社区的工作,因此 Torvalds 决定着手研究许可证更为灵活的版本控制系统。尽管最初 Git 的开发是为了辅助 Linux 内核开发的过程,但是我们已经发现在很多其他自由软件项目中也使用了 Git。例如 很多 Freedesktop 的项目迁移到了 Git 上。
Kohana 是一款纯 PHP5 的框架,基于 MVC 模式开发, 它的特点就是高安全性,轻量级代码,容易使用。 2009年9月发布了3.0版本,支持HMVC模式。
简介编辑
kohana是一个基于MVC模型构建的PHP5框架,它的目标旨在安全,重量轻,且易于使用。
特点编辑
1。严谨的PHP5面向对象编程。优势:可见性保护,自动加载,重载,接口,抽象类,单一模式等。
2。社区,没有公司。Kohana是由社区构想,讨论,及编码。Kohana的开发者们来自世界各地,有着各自的天赋。这使得开发速度得以提高,并在短时间内提供bug修复以及反馈用户提出的建议。
3。GET,POST,COOKIE,SESSION数组都能按照预期的工作。Kohana不限制你访问全局数据,但是提供了XSS过滤和检查所有的全局变量。
4。级联式资源,模块和继承。可以从你的系统,程序或者模块路径的任何地方加载控制器,模型,类库,助手和视图。配置参数可以继承或动态声明覆盖。
5。没有名字空间冲突。类前缀和后缀用来保护名字空间冲突。
6。类的自动加载。Kohana里的所有类都能自动被框架加载,不需要手动引用。
7。API一致性。类能使用驱动不同的访问不同的协议来保持API的一致性,即使底层发生变化。
8。强大的事件处理机制。Kohana的事件可被动态的添加、替换或删除。
目标编辑
更安全在任何时候,对安全的最佳做法:
*kohana内置XSS保护,也可以使用HTMLPurfier作为的XSS过滤器。
*所有数据插入到数据库是避免使用数据库特定方法,如mysql_real_escape_string,以防止SQL注入攻击。Kohana里的magicquotes是被关闭的。
*所有POST,GET,和COOKIE数据都经过处理,以防止恶意行为。
更轻量级以最有效的方式提供最大的灵活性:
*Kohana尽可能的使用公约配置(conventionoverconfiguration)。
*合理的配置和高度优化的环境检测例程允许kohana运行在几乎任何php5环境。
*松耦合(Loosecoupling)是用来总是载入的最少数量的文件,减少资源的使用。
*一个清洁的API和使用本土职能,尽可能使kohana成为最快的php5框架之一。
http://kohanaframework.org/
我们知道,PHP语言对大小写敏感问题的处理有点乱,在编程时需要多加注意,特别是在linux平台中更要注意。本文对这一问题做个总结,供大家学习参考。
说明:
不鼓励用这些规则,仅作为学习研究之用。
在编程中,应当坚持“大小写敏感”,遵循统一的代码规范。
一、大小写敏感
1. 变量名区分大小写
所有变量均区分大小写,包括普通变量以及$_GET,$_POST,$_REQUEST,$_COOKIE,$_SESSION,$GLOBALS,$_SERVER,$_FILES,$_ENV 等;
例子:
<?php
$abc = ‘abcd’;
echo $abc; //输出 ‘abcd’
echo $aBc; //无输出
echo $ABC; //无输出
?>
2. 常量名默认区分大小写,通常都写为大写
<?php
define(“ABC”,”Hello World”);
echo ABC; //输出 Hello World
echo abc; //输出 abc
?>
3. php.ini配置项指令区分大小写
如 file_uploads = 1 不能写成 File_uploads = 1
二、大小写不敏感
1. 函数名、方法名、类名 不区分大小写,但推荐使用与定义时相同的名字
例子:
<?php
function show(){
echo “Hello World”;
}
show(); //输出 Hello World 推荐写法
SHOW(); //输出 Hello World
?>
<?php
class cls{
static function func(){
echo “hello world”;
}
}
Cls::FunC(); //输出hello world
?>
2. 魔术常量不区分大小写,推荐大写
包括:__LINE__、__FILE__、__DIR__、__FUNCTION__、__CLASS__、__METHOD__、 __NAMESPACE__。
例子:
<?php
echo __line__; //输出 2
echo __LINE__; //输出 3
?>
3. NULL、TRUE、FALSE不区分大小写
例子:
<?php
$a = null;
$b = NULL;
$c = true;
$d = TRUE;
$e = false;
$f = FALSE;
var_dump($a == $b); //输出 boolean true
var_dump($c == $d); //输出 boolean true
var_dump($e == $f); //输出 boolean true
?>
4.类型强制转换,不区分大小写
包括
MagenTo默认支持多语言网店,不过要使用多语言功能,需要进行一些设置。
一、后台多语言支持(中文化)
Magento登录后台时默认的是显示的是英文界面,在页面左下角选择语言为中文就会跳转为中文界面,如果还是显示英文,则是因为没有下载中文语言包的原因,按以下步骤操作:
1.下载中文语言包
2.上传到指定目录
3.切换语言为简体中文,并清空缓存
二、前台多语言支持(多种方案)
1.下载指定语言包
2.上传到指定目录(app/local)
3.登陆管理后台 并创建一个新的store view在Manage stores页面,指定名称如“Chinese”
4.到admin panel System > Configuration > general处
然后选择 store view “Chinese” locale options > locale > Chinese
select store view “English” locale options > locales > English
保存设置。这样你就有了2种语言的界面。其实是2个store view。
最后刷新缓存,在System->Cache Management
上面介绍的方案是单网店对应多语言,如果要实现不同的域名或子目录对应不同的语言,可以添加多个Store,并指定对应的语言即可。
三、产品数据,文章页面的多语言实现
上述步骤安装完成后,仅是框架页面和导航结构实现了多语言的支持。如果是自己添加的产品分类,产品标题和内容,文章CMS页面等处要显示对应的语言内容,还需要为不同的语言/商店添加不同的语言内容,如不另外添加的话,会显示默认语言添加的内容。
如果你的网站产品内容比较多,要添加多语言的内容的工作就会比较繁琐,需要把一个产品标题或内容从原来的语言翻译成目标语言,然后再添加到指定的语言产品数据库。
在安装 Apache 时,会默认文件根目录为安装目录下的htdocs。可以修改 Apache 的配置文件 httpd.conf 里有关文件根目录的设置修改根目录。
修改 Apache 文件根目录的操作如下:
1. 备份 Apache 配置文件 httpd.conf,该配置文件的路径是:
%install%\conf\httpd.conf
2. 打开 http.conf 文件,找到 DocumentRoot 为开头的那一行,将DocumentRoot改成新的 DocumentRoot 路径
比如想改到 D:\website,就改成
DocumentRoot D:/website”
3. 然后找到 http.conf 文件中的如下内容
# This should be changed to whatever you set DocumentRoot to.#<Directory “C:/Program Files/Apache Software Foundation/Apache2.2/htdocs”>
将 Diectory 中的路径改成你新设的文件根目录,比如:
<Directory “D:/website”>
5. 重新启动 Apache
修改了文件根目录完成
////////////////////////////////其他虚拟目录创建
环境:appserv构架的,端口:90
测试页面:http://127.0.0.1:90
目的:将f盘下的www文件夹作为虚拟目录!
找到
C:\\AppServ\\Apache2.2\\conf 里面的httpd.conf文件,(修改前备份下)用记事本打开,找到:
Alias /icons/ “C:/AppServ/Apache2.2/icons/”
<Directory “C:/AppServ/Apache2.2/icons”>
Options Indexes MultiViews
AllowOverride None
Order allow,deny
Allow from all
</Directory>
修改如下:
Alias /icons/ “C:/AppServ/Apache2.2/icons/”
Alias /life/ “f:/www/”
<Directory “C:/AppServ/Apache2.2/icons”>
Options Indexes MultiViews
AllowOverride None
Order allow,deny
Allow from all
</Directory>
<Directory “f:/www”>
Options Indexes MultiViews
AllowOverride None
Order allow,deny
Allow from all
</Directory>
重新启动Apache
测试访问:
收藏于 2010-06-13
MYSQL的事务处理主要有两种方法。
1、用begin,rollback,commit来实现
begin 开始一个事务
rollback 事务回滚
commit 事务确认
2、直接用set来改变mysql的自动提交模式
MYSQL默认是自动提交的,也就是你提交一个QUERY,它就直接执行!我们可以通过
set autocommit=0 禁止自动提交
set autocommit=1 开启自动提交
来实现事务的处理。
当你用 set autocommit=0 的时候,你以后所有的SQL都将做为事务处理,直到你用commit确认或rollback结束。
注意当你结束这个事务的同时也开启了个新的事务!按第一种方法只将当前的作为一个事务!
个人推荐使用第一种方法!
MYSQL中只有INNODB和BDB类型的数据表才能支持事务处理!其他的类型是不支持的!
***:一般MYSQL数据库默认的引擎是MyISAM,这种引擎不支持事务!如果要让MYSQL支持事务,可以自己手动修改:
方法如下:1.修改c:\appserv\mysql\my.ini文件,找到skip-InnoDB,在前面加上#,后保存文件。
2.在运行中输入:services.msc,重启mysql服务。
3.到phpmyadmin中,mysql->show engines;(或执行mysql->show variables like ‘have_%’; ),查看InnoDB为YES,即表示数据库支持InnoDB了。
也就说明支持事务transaction了。
4.在创建表时,就可以为Storage Engine选择InnoDB引擎了。如果是以前创建的表,可以使用mysql->alter table table_name type=InnoDB;
或 mysql->alter table table_name engine=InnoDB;来改变数据表的引擎以支持事务。
*/
/*************** transaction–1 ***************/
$conn = mysql_connect(‘localhost’,’root’,’root’) or die (“数据连接错误!!!”);
mysql_select_db(‘test’,$conn);
mysql_query(“set names ‘GBK'”); //使用GBK中文编码;
//开始一个事务
mysql_query(“BEGIN”); //或者mysql_query(“START TRANSACTION”);
$sql = “INSERT INTO `user` (`id`, `username`, `sex`) VALUES (NULL, ‘test1’, ‘0’)”;
$sql2 = “INSERT INTO `user` (`did`, `username`, `sex`) VALUES (NULL, ‘test1’, ‘0’)”;//这条我故意写错
$res = mysql_query($sql);
$res1 = mysql_query($sql2);
if($res && $res1){
mysql_query(“COMMIT”);
echo ‘提交成功。’;
}else{
mysql_query(“ROLLBACK”);
echo ‘数据回滚。’;
}
mysql_query(“END”);
/**************** transaction–2 *******************/
/*方法二*/
mysql_query(“SET AUTOCOMMIT=0”); //设置mysql不自动提交,需自行用commit语句提交
$sql = “INSERT INTO `user` (`id`, `username`, `sex`) VALUES (NULL, ‘test1’, ‘0’)”;
$sql2 = “INSERT INTO `user` (`did`, `username`, `sex`) VALUES (NULL, ‘test1’, ‘0’)”;//这条我故意写错
$res = mysql_query($sql);
$res1 = mysql_query($sql2);
if($res && $res1){
mysql_query(“COMMIT”);
echo ‘提交成功。’;
}else{
mysql_query(“ROLLBACK”);
echo ‘数据回滚。’;
}
mysql_query(“END”); //事务处理完时别忘记mysql_query(“SET AUTOCOMMIT=1”);自动提交
/******************对于不支持事务的MyISAM引擎数据库可以使用表锁定的方法:********************/
//MyISAM & InnoDB 都支持,
/*
LOCK TABLES可以锁定用于当前线程的表。如果表被其它线程锁定,则造成堵塞,直到可以获取所有锁定为止。
UNLOCK TABLES可以释放被当前线程保持的任何锁定。当线程发布另一个LOCK TABLES时,或当与服务器的连接被关闭时,所有由当前线程锁定的表被隐含地解锁。
*/
mysql_query(“LOCK TABLES `user` WRITE”);//锁住`user`表
$sql = “INSERT INTO `user` (`id`, `username`, `sex`) VALUES (NULL, ‘test1’, ‘0’)”;
$res = mysql_query($sql);
if($res){
echo ‘提交成功。!’;
}else{
echo ‘失败!’;
}
mysql_query(“UNLOCK TABLES”);//解除锁定
百度文献:
http://wenku.baidu.com/view/62d2b7360b4c2e3f572763c8.html
MYSQL高级特性 — 事务处理 下面以两个银行账户之间的转账为例子进行演示。 要使用MySQL中的事务处理,首先需要创建使用事务表类型(如BDB = Berkeley DB或InnoDB)的表。 CREATE TABLE account ( account_id BIGINT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, balance DOUBLE ) TYPE = InnoDB; 要在事务表上使用事务处理,必须要首先关闭自动提交: SET AUTOCOMMIT = 0; 事务处理以BEGIN命令开始: BEGIN; 现在mysql客户处在于服务器相关的事物上下文中。任何对事务表所做的改变在提交之前不会成为永久性的改变。 UPDATE ACCOUNT SET balance = 50.25 WHERE account_id = 1; UPDATE ACCOUNT SET balance = 100.25 WHERE account_id = 2; 在做出所有的改变之后,使用COMMIT命令完成事务处理: COMMIT; 当然,事务处理的真正优点是在执行第二条语句发生错误时体现出来的,若在提交前终止整个事务,可以进行回滚操作: ROLLBACK; 下面是另一个例子,通过MYSQL直接进行数学运算: SELECT @first := balance FROM account WHERE account_id = 1; SELECT @second := balance FROM account WHERE account_id = 2; UPDATE account SET balance = @first – 25.00 WHERE account_id = 1; UPDATE account SET balance = @second + 25.00 WHERE account_id = 2; 除了COMMIT命令外,下列命令也会自动结束当前事务: ALTER TABLE BEGIN CREATE INDEX DROP DATABASE DROP TABLE LOCK TABLES RENAME TABLE TRUNCATE UNLOCK TABLES 内容来自于《MySQL 权威指南(Managing & Using MySQL)》, O’Reilly & Associates, Inc. 作者George Reese等。
PHP+mysql,由于程序中需要同时像两个表中插入数据,而且不能插错,因此应该定义一个事物操作。要么两条都做,要么两条都不做。
注意:每次使用事物后,需将事物设置回自动提交!
例一:
<?php
$handler=mysql_connect(“localhost”,””,””);
mysql_select_db(“task”);
mysql_query(“SET AUTOCOMMIT=0”);//设置为不自动提交,因为MYSQL默认立即执行
mysql_query(“BEGIN”);//开始事务定义
if(!mysql_query(“insert into trans (id) values(‘2’)”))
{
mysql_query(“ROOLBACK”);//判断当执行失败时回滚
}
if(!mysql_query(“insert into trans (id) values(‘4’)”))
{
mysql_query(“ROOLBACK”);//判断执行失败回滚
}
mysql_query(“COMMIT”);//执行事务
mysql_close($handler);
例二:
<?php
$id=$_GET[id];
include_once(“conn.php”);
$conn->autocommit(false);
if(!$conn->query(“delete from tb_sco where id='”.$id.”‘”))
{
$conn->rollback();
}
if(!$conn->query(“delete from tb_stu where id='”.$id.”‘”))
{
$conn->rollback();
}
$conn->commit();
$conn->autocommit(true);
?>
<?php
//echo “=======”;exit;
$conn=mysql_connect(“localhost”,”root”,”root”);
if(!$conn){echo “数据库连接出错!”;
die();
}
mysql_select_db(“try”,$conn);
mysql_query(“SET NAMES GBK”);
$sql=”update aa set moeny=moeny-200 where uid=1″;
$sql2=”update bb set moeny=moeny+200 where uid=1″; //测试的时候,可以把这个写错,看效果
//$rst=mysql_query($sql2);
//echo $rst;exit;
mysql_query(“set autocommit=0”);//设置为不自动提交,因为MYSQL默认立即执行
//$t1=mysql_query($sql);
//$t2=mysql_query($sql2);
if(!mysql_query($sql)){
mysql_query(“ROOLBACK”);//判断执行失败回滚
echo “更新失败”;exit;
}
elseif(!mysql_query($sql2)){
mysql_query(“ROOLBACK”);//判断执行失败回滚
echo “更新失败”;exit;
}
else{
mysql_query(“commit”);//执行事务
echo “更新成功!”;exit;
}
收藏于 2010-07-20
<?php
$file = fopen(‘text.csv’,’r’);
while ($data = fgetcsv($file)) { //每次读取CSV里面的一行内容
//print_r($data); //此为一个数组,要获得每一个数据,访问数组下标即可
$goods_list[] = $data;
}
//print_r($goods_list);
echo $goods_list[0][1];
fclose($file);
?>
在实际工作中,很多时候需要把网站上的一些数据下载到CSV文件里,方便以后查看。
亦或者是用CSV进行一些批量的上传工作。
这个时候我们就需要对CSV进行读写操作。
1.CSV的读取操作
view plaincopy to clipboardprint?
<?php$file = fopen(‘D:/file/file.csv’,’r’);while ($data = fgetcsv($file)) { //每次读取CSV里面的一行内容print_r($data); //此为一个数组,要获得每一个数据,访问数组下标即可}fclose($file);?>
2.CSV的写入操作
view plaincopy to clipboardprint?
<?php$fp = fopen(‘d:/file/file.csv’, ‘w’);fputcsv($fp,array(‘aaa’,’bbb’,’cccc’));fputcsv($fp,array(‘mmm’,’yyy’,’haha’)); //fputcsv可以用数组循环的方式进行实现fclose($fp);?>
3.输出CSV(下载功能)
view plaincopy to clipboardprint?
<?phpheader(“Content-Type: text/csv”);header(“Content-Disposition: attachment; filename=test.csv”);header(‘Cache-Control:must-revalidate,post-check=0,pre-check=0’);header(‘Expires:0’);header(‘Pragma:public’);echo “id,areaCode,areaName\n”;echo “1,cn,china\n”;echo “2,us,America\n”;?>
$xmlstring=<<<XML
<?xml version="1.0" encoding="ISO-8859-1"?>
<note>
<to>xuduowei</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don’t forget the meeting!</body>
</note>
XML;
$xml = simplexml_load_string($xmlstring);
var_dump($xml);
输出:
object(SimpleXMLElement)#1 (4) { [“to”]=> string(4) “George” [“from”]=> string(4) “John” [“heading”]=> string(8) “Reminder” [“body”]=> string(29) “Don’t forget the meeting!” }
$xmlstring = <<<XML
<?xml version="1.0" encoding="ISO-8859-1"?>
<note>
<to>xuduowei</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don’t forget the meeting!</body>
</note>
XML;
$xml = simplexml_load_string($xmlstring);
//$xml = simplexml_load_string($xmlstring,'SimpleXMLElement',LIBXML_NOCDATA);
echo $xml->to;
php 的simplexml_load_string后两个参数有什么用处?
第二个参数表示解析所使用的类,类必须继承于SimpleXMLElement,而默认值就是SimpleXMLElement。
第三个参数表示解析的选项,LIBXML_NOCDATA表示不对CDATA进行转意,而是把他当成普通的文本进行解析。
假设XML节点里面如果有<goods_name><![CDATA[小牛N1]]></goods_name>,那么最终转换成对象里面是没有goods_name这个值
的,如果加了LIBXML_NOCDATA,值为小牛N1,相当于把<![CDATA[小牛N1]]>转换成了文本返回
xml 是一种创建元数据的语言,元数据是描述其它数据的数据,PHP中的XML处理是基于LIBXML2的,安装时默认开启。
可以通过phpinfo()函数查看是否开启了XML处理模块,DOM,LIBXML,SAMPLEXML。
首先,通过samplexml_load_file函数把xml文件加载到一个对象中,samplexml_load_file可以用户远程文件.
例如:
$xml = samplexml_load_file(“messages.xml”); // 本地文件系统,当前目录
$xml=simplexml_load_file(“http://www.xuduowei.com/tc/cs.xml”);//远程服务器上的
用 var_dump($xml) 和 print_r($xml) 分别输出其结构.var_dump给出了变量的类型和长度,而print_r可读性更强
输出对象中的所有元素名称和它的值.
echo $xml->MessageTitle; //输出消息的标题
echo $xml->MessageBody; // 输出消息体
echo $xml->MessageAuthor; //消息的作者
echo $xml->MessageDate; // 消息产生的日期
echo $xml->MessageNumber; // 消息代码
$xml=”<GetLatestContestAppResp>
<ret>0</ret>
<LatestContestApp>
<ContestApp>
<UserId>111</UserId>
<RealName>张三</RealName>
<AppName>battlefield1942</AppName>
</ContestApp>
<ContestApp>
<UserId>222</UserId>
<RealName>李四</RealName>
<AppName>battlefield II</AppName>
</ContestApp>
<ContestApp>
<UserId>333</UserId>
<RealName>王五</RealName>
<AppName>battlefield 1943</AppName>
</ContestApp>
… …
</LatestContestApp>
</GetLatestContestAppResp>”;
$xml_arr = simplexml_load_string($xml);
//print_r($xml_arr);
//echo count($xml_arr->LatestContestApp->ContestApp).”==”; //总数计算
//echo $xml_arr->LatestContestApp->ContestApp[1]->UserId;//取得相应的节点值
解决问题:
如何让自己的本地APACHE服务器支持”.htaccess”呢?其实只要简单修改一下apache的httpd.conf设置就可以让APACHE支持.htaccess了,来看看操作
打开httpd.conf文件(在那里? APACHE目录的CONF目录里面),用文本编辑器打开后,查找
(1)
Options FollowSymLinks
AllowOverride None
改为
Options FollowSymLinks
AllowOverride All
(2)去掉下面的注释
LoadModule rewrite_module modules/mod_rewrite.so
就可以了