直接使用try...catch....结构。比如:
创新互联主营怀宁网站建设的网络公司,主营网站建设方案,手机APP定制开发,怀宁h5微信平台小程序开发搭建,怀宁网站营销推广欢迎怀宁等地区企业咨询
try
{
DB::query("SELECT count(*) FROM pre_111 WHERE fid = $fid";
}
catch(exception $ex)
{
echo($ex-getMessage());
}
从Mysql 5.5 开始为我们提供了SIGNAL函数来实现这个功能。
[sql] view plain copy
CREATE TRIGGER `tg_order_create` AFTER INSERT ON `tp_order` FOR EACH ROW BEGIN
DECLARE msg varchar(200);
/*冻结金额*/
IF 2=NEW.condition THEN
UPDATE `tp_user` SET `frozen_amount`=`frozen_amount`+NEW.amount WHERE `id`=NEW.uid AND `amount`-`frozen_amount` NEW.amount;
/*如果余额不足,产生一个错误*/
IF ROW_COUNT() 1 THEN
set msg = "用户余额不足以完成支付.";
SIGNAL SQLSTATE 'HY000' SET MESSAGE_TEXT = msg;
END IF;
/*扣除金额*/
ELSEIF 3=NEW.condition THEN
UPDATE `tp_user` SET `amount`=`amount`-NEW.amount WHERE `id`=NEW.uid AND `amount`-`frozen_amount` NEW.amount;
/*如果余额不足,产生一个错误*/
IF ROW_COUNT() 1 THEN
set msg = "用户余额不足以完成支付.";
SIGNAL SQLSTATE 'HY000' SET MESSAGE_TEXT = msg;
END IF;
END IF;
END;
这里这条触发器的功能是库存操作,当库存足够的时候 减少库存,否则 抛出一个异常并报告商品库存不足:
[sql] view plain copy
CREATE TRIGGER `TG_order_detail_dec_stock` BEFORE INSERT ON `tp_order_detail` FOR EACH ROW BEGIN
DECLARE msg VARCHAR(200);
UPDATE `tp_stock` SET `num`=`num`-NEW.num WHERE `goods_id`=NEW.goods_id AND `mid`=NEW.mid AND `num`=NEW.num;
IF ROW_COUNT() 1 THEN
SELECT CONCAT(`name`, ' 库存不足.') INTO msg FROM `tp_goods` WHERE `id`=NEW.goods_id;
SIGNAL SQLSTATE 'HY000' SET MESSAGE_TEXT = msg;
END IF;
END;
在PHP端的处理(注:使用ThinkPHP框架):
[php] view plain copy
//前面省略若干行....
try {
if (false === ($order_pk = $tbl_order-add($order))) {
$tbl-rollback();
echo json_encode(array('success' = -1, 'message' = "创建订单失败!."), JSON_UNESCAPED_UNICODE);
return;
}
}catch (\PDOException $e){
$errInfo=$e-errorInfo[2];
$tbl-rollback();
echo json_encode(array('success' = -1, 'message' = "创建订单失败!,{$errInfo}"), JSON_UNESCAPED_UNICODE);
return;
}
//后面省略若干行....
DECLARE处理程序的使用:
DECLARE handler_type HANDLER FOR condition_value[,...] sp_statement
其中,
handler_type的取值范围:CONTINUE | EXIT | UNDO
condition_value的取值范围:SQLSTATE [VALUE] sqlstate_value | condition_name | SQLWARNING | NOT FOUND | SQLEXCEPTION | mysql_error_code
这个语句指定每个可以处理一个或多个条件的处理程序。如果产生一个或多个条件,指定的语句被执行。 对一个CONTINUE处理程序,当前子程序的执行在执行处理程序语句之后继续。对于EXIT处理程序,当前BEGIN...END复合语句的执行被终止。UNDO 处理程序类型语句还不被支持。
· SQLWARNING是对所有以01开头的SQLSTATE代码的速记。
· NOT FOUND是对所有以02开头的SQLSTATE代码的速记。
· SQLEXCEPTION是对所有没有被SQLWARNING或NOT FOUND捕获的SQLSTATE代码的速记。
注:除了SQLSTATE值,MySQL错误代码也不被支持。
例:
[sql] view plain copy print?
delimiter $$
CREATE TABLE `_t1` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`val1` varchar(20) DEFAULT NULL,
`val2` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=113 DEFAULT CHARSET=latin1$$
[sql] view plain copy print?
DELIMITER $$
CREATE DEFINER=`abandonship`@`%` PROCEDURE `P_TestException`()
BEGIN
declare _var,_err int default 0;
declare continue handler for sqlexception, sqlwarning, not found set _err=1;
insert into _t1(val1, val2) value(2012,'abandonship');
if _err=1 then
set _var = 2;
end if;
select case when _var = 2 then '出错了' else _var end;
调用该存储过程将返回:出错了
1.停止mysql服务:
右键点击“我的电脑”图标,出现右键菜单后左键点击“管理”。弹出“电脑管理”对话框后,左键点击“服务与程序”,接着点击“服务”,最后找到mysql服务并将其关闭。
2.进入控制面板,点击卸载程序,进入卸载程序对话框后卸载mysql。
3.组合键W+R进入运行,输入“regedit”,查看下面 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services 的键值,将mysql键值(mysql、mysqladmin)删掉 。
4.重启系统。
5.再次安装mysql程序。
flask中向mysql中数据操作会出现字符集的问题,比如创建数据模型:db.create_all()时,控制台会出现warring 1366 的字符集警告,是这样的:
这个异常是mysql问题,而非python的问题,这是因为mysql的字段类型是utf-xxx, 而在mysql中这些utf-8数据类型只能存储最多三个字节的字符,而存不了包含四个字节的字符。
解决方法:
修改mysql数据表的字段类型为utf8mb4,只有在mysql5.5之后可以支持。
在flask配置中设置字符集:
SQLALCHEMY_DATABASE_URI = "mysql+pymysql://root:123456@127.0.0.1:3306/test?charset=utf8"
正常的下载和安装教程网上很多,在此不赘述了,下面聊一下碰到的异常情况。
点击execute后,出现图中的叉叉后,不要慌,复制requirement下面的英文名称,在网上搜索下载后,手动安装,安装完成后,再点击back,返回到上一步;然后再点击next,红叉叉全消失了。
下载地址:
尽管满屏广告,但不用担心下载下来后,安装一大堆垃圾!
python正常下载和安装即可,vs如果到官网下,可能速度会很慢很慢,而且那几个版本的文件都比较大,搞不好,会让你下载到怀疑人生,当然,从别的渠道还是能找到资源的。
总结:1、安装的过程中,首先要了解一点英文,否则是很难安装下去的
2、碰到了异常,分析异常产生的原因,能否用其他方法解决?多去思考,多去尝试
3、如果没把握,最好先备份好系统
4、在折腾中提高
mysql下载的时候出现运行环境异常是mysql服务没有启动。
1、以管理员身份运行cmd(左下角开始按钮选择以管理员身份运行cmd即可)。
2、输入:cdC:\ProgramFiles\MySQL\MySQLServer5.7\bin进入mysql的bin文件夹。
3、输入:mysqld-install(如果不用管理员身份运行,将会因为权限不够而出现错误:Install/RemoveoftheServiceDenied。)。
4、安装成功。
5、运行mysqld--initialize(标题问题所在,若没有init则不存在data目录,自然无法启动成功)。
6、安装成功后就要启动服务了,继续在cmd中输入:netstartmysql,服务启动成功。
7、服务启动成功之后,就可登录了,输入mysql-uroot-p经常会遇到直接回车登陆不上的情况,原因在于5.7版本在安装时自动给了一个随机密码。
售后响应及时
7×24小时客服热线数据备份
更安全、更高效、更稳定价格公道精准
项目经理精准报价不弄虚作假合作无风险
重合同讲信誉,无效全额退款