Category: Study

MySQL 插入错误

MySQL insert error。。。。。。。。   一条简单的SQL语句,竟然插入错误: INSERT INTO USER (id, describe) VALUES (‘David’, ‘diudiu’); 咋一看确实没错啊,瞅半天才发现,是由于table中有字段名是MySQL的保留字。这里就是‘describe’,报错也就理所当然了。 解决办法: 在关键字的地方加上反引号”`”,就是键盘1旁边的那个字符。 MySQL就是通过添加反引号来区别保留字。 上述修改为 INSERT INTO USER (id, `describe`) VALUES (‘David’, ‘diudiu’); 即可。    

Linux 下 C++ 连接 Mysql

——国外有一篇博客写得挺好,有一些小错误,改正以后翻译过来,发这里了。 C++是一个效率非常高的编程语言 Linux 是一个类Unix操作系统,它促进了开源软件社区的发展,并且用这些开源软件就几乎足以构建一个复杂精妙的企业系统。 MySQL是一个流行的多线程、多用户的数据库管理系统,全球有超过1000万的安装量。   这篇文章将演示如何在Linux下用C++连接MySQL。 首先我们需要将所需要的头文件和库全部包含进来 #include <stdio.h> #include <mysql.h> 然后我们来定义一下main函数 int main() { // code  return 0; }; 然后我们定义一下需要用到的变量,你应该将这些写到main函数里去。 MYSQL_RES *result; MYSQL_ROW row; MYSQL *connection, mysql; int state; 既然要使用MySQL数据库,我们首先就得连上它,使用下面的代码即可: mysql_init(&mysql); connection = mysql_real_connect(&mysql,host,usr,pswd,database,0,0,0); 其中 host – 数据库所在主机的名字,比如 “localhost” 或者 “192.168.250.100” usr – 连接数据库时使用的用户名 pswd – 连接数据库时使用的密码 database – 数据库的名称 如果有错误发生,如用户名/密码不匹配,我们可以通过以下代码获取到错误信息: if (connection == NULL) { printf(“%s\n”, […]

Paper things

在线考试系统功能需求以及数据库定义 由于是技术说明文档,就不再叙述背景以及国内外现状等。 在线考试系统模块需要实现的功能在这里分传统题目考试、程序题目在线判定(Online Judgement)两大部分叙述。 一:传统题目部分 对于题库: 1. 能够添加多种题型(单选、多选、判断、填空、简单等) 2. 能够添加多种题目分类(如“计算机基础“,“管理“),并支持子类父类(如”C语言” 属于 “计算机基础”) 3. 对于每一种题型,能够添加试题 4. 对于每一道试题,有正确率统计,便于出题的时候进行难度判断 5. 对于每一道试题,能够指定属于哪一分类 6. 对于每一道试题,除了设置答案以外,还需有答案解析,便于实现以后某些功能需求(如某些考生看不懂答案)。 对于试卷: 1. 能够设置试卷的名称、分类等(分类参考题库模块的分类) 2. 能够直接从题库里提取试题,组成试卷 3. 组卷选题过程中支持重复性检测,以及难度提示(根据题库中题目的正确率等作为参考) 4. 支持相同题型不同分数(即可根据难度设置分数,参考高考理综考试) 5. 能够查询某一时间段里出的试卷(如今年期末考试出题想参考1999年的试卷) 对于考卷: 1. 能够将试卷的题目乱序以后组成考卷 2. 维护考卷的基本信息 3. 记录考卷中每一道题的正误(题库中题目的正确率来源于此) 4. 支持缓冲。由于对于每一次考试,有多少考生参加就有多少张考卷,如果对每一道题都访问数据库,会由于频繁反问造成系统效率不高,所以需要提供缓冲机制。 5. 支持到时间收卷 对于考生: 1. 维护考生的基本信息 2. 考生作为与外界系统的主要接口,将其他系统的用户与在线考试系统联系起来,所以在该系统中,考生参加考试一律只使用考生编号。 总体草图 对于数据库: 1.  由于在该系统中会涉及到较多的事务处理,所以讲数据库引擎采取ENGINE = InnoDB模式 2.  数据库表如下图所示。 具体每个字段代表什么,以及具体的SQL创建语句已经在“数据库创建语句.sql”里详细列出,这里给出对于某些数据库表的解释: […]

PHP调用C/C++动态链接库

摘要 有时候,单纯依靠 PHP “本身”是不行的。尽管普通用户很少遇到这种情况,但一些专业性的应用则经常需要将 PHP 的性能发挥到极致(这里的性能是指速度或功能)。由于受到 PHP 语言本身的限制,同时还可能不得不把庞大的库文件包含到每个脚本当中。因此,某些新功能并不是总能被顺利实现,所以我们必须另外寻找一些方法来克服 PHP 的这些缺点。 了解到了这一点,我们就到了应该接触一下 PHP 的心脏并探究一下它的内核——可以编译成 PHP 并让之工作的 C 代码——的时候了。 概述: PHP调用动态链接库几个必要步骤为: 1. C/C++编写动态链接库,编译打包成.so文件 2. 初始化一个新的PHP扩展 3. 配置、编写PHP扩展内容,在扩展中使用C/C++调用.so 4. 编译并添加PHP扩展 5. 在PHP应用中直接调用PHP扩展里暴露出来的API 为了从能运行的最简单的例子开始,所以下面的叙述可能不会严格按照上面列的步骤来写,也有可能会重复穿插着写。但总体顺序是一致的。 一. C/C++编写动态链接库,编译打包成.so文件 如果还不会用C++调用自己写的.so库,请参考我的这篇文章: http://keping.me/cpp_invoke_so/ 文中从什么是Name Mangling开始,到如何用调用一个包含简单函数的so库,再到如何从so中加载类,都有详细叙述,并附有可运行示例代码。 二. 初始化PHP扩展 本文中,我们将创建一个叫“vehicle”的PHP扩展,其中包含一个“Car”类。 将要创建的扩展会涉及到以下文件需要修改,这些文件将会出现在vehicle目录下。后面会一一叙述这些文件是怎么来的,现在只是大致了解一下。 car.h —— 包含了C++写的类,即Car的定义 car.cc —— Car类的具体实现 php_vehicle.h —— 包含了PHP创建扩展所需要的一些头文件,外部变量定义等。 vehicle.cc —— 扩展的主要源码文件,这里面会调用到Car类 config.m4 —— PHP扩展的配置文件 1. […]

PHP与C++性能比较

PHP是速度很快的脚本语言,但是用了框架以后好像感觉挺慢的。于是猜测会不会PHP本身也不是很快。如果不是很快,能否采用PHP调用本地动态链接库的形式来提升速度。 于是有了下面的对比实验。 测试环境 1. 硬件环境如下图所示。 2. 软件环境 系统: Ubuntu 12.10 gcc版本: Thread model: posix gcc version 4.7.2 (Ubuntu/Linaro 4.7.2-2ubuntu1) php版本: PHP 5.3.22 (cli) (built: Mar 14 2013 20:37:16) Copyright (c) 1997-2013 The PHP Group Zend Engine v2.3.0, Copyright (c) 1998-2013 Zend Technologies php开发环境: LAMP,所有安装包均是通过源码编译安装而成,编译过程中会自动根据本机各项参数进行最优配置。性能比apt-get install命令直接安装好。 关于以源码包方式搭建LAMP请参考文章:http://keping.me/linux-php-dev-by-source-style/ 测试方法 由于冒泡排序在时间复杂度上相当稳定——O(n2),在最大程度上减少了数据可能带来的影响,故采取计算冒泡排序的运行时间的方法来进行此次实验。 对比测试分组 分组1: C++直接调用程序内的函数 分组2: C++调用打包好的动态链接库文件(.so文件,该文件也是自己写好并打包) 分组3: PHP直接调用程序内的函数 […]

Linux 常用命令

老是忘记一些命令。于是便记了下来:) SSH常用命令 1. 不带端口号的连接: $ ssh -l username ip $ ssh -l ubuntu0 192.168.123.100 2. 带端口号的链接: $ ssh -l username ip -p port $ ssh -l root 224.217.33.111 -p 8888 SCP常用命令 1. 从远端拷贝单个文件到本地,带端口号(-P 为大写): $ scp -P port root@ip:path_remote path_local $ scp -P 8888 root@224.217.33.111:/home/aku/www/weekphp/sql.txt /home/david/ 2. 从远端拷贝整个文件目录到本地,带端口号(-P 为大写): $ scp -r -p port username@ip:path_remote […]

C++调用自己的.so

由于一些原因,需要在C++中动态加载自己写的动态链接库(.so)文件。网络上的资源挺多,我也看了不少,参考最多的是下面这三篇 1. dlopen加载c++ 函数及类: http://blog.csdn.net/lwj1396/article/details/5204484 2. 上一篇的英文版本: http://www.isotton.com/devel/docs/C++-dlopen-mini-HOWTO/C++-dlopen-mini-HOWTO.html#theproblem 3. 动态调用动态库方法 .so: http://blog.csdn.net/lbmygf/article/details/7401862 再说一说自己的心得吧。 首先介绍一下动态库和静态库之间的区别 静态库是指编译连接时,把库文件的代码全部加入到可执行文件中,所以生成的文件较大,但运行时,就不再需要库文件了。即,程序与静态库编译链接后,即使删除静态库文件,程序也可正常执行。 动态库正好相反,在编译链接时,没有把库文件的代码加入到可执行文件中,所以生成的文件较小,但运行时,仍需要加载库文件。即,程序只在执行启动时才加载动态库,如果删除动态库文件,程序将会因为无法读取动态库而产生异常。 那么如何调用动态库?如何在C语言下,其实是很简单的(调用dlopen、dlsym和dlclose就够了),但对C++来说,情况稍微复杂。动态加载一个C++库的困 难一部分是因为C++的name mangling 然后从介绍Name Mangling开始 在每个C++程序(或库、目标文件)中,所有非静态(non-static)函数在二进制文件中都是以“符号(symbol)”形式出现的。这些符号都是唯一的字符串,从而把各个函数在程序、库、目标文件中区分开来。 在C中,符号名正是函数名:strcpy函数的符号名就是“strcpy”,等等。这可能是因为两个非静态函数的名字一定各不相同的缘故。 而C++允许重载(不同的函数有相同的名字但不同的参数),并且有很多C所没有的特性──比如类、成员函数、异常说明──几乎不可能直接用函数名作符 号名。为了解决这个问题,C++采用了所谓的name mangling。它把函数名和一些信息(如参数数量和大小)杂糅在一起,改造成奇形怪状,只有编译器才懂的符号名。例如,被mangle后的foo可能 看起来像foo@4%6^,或者,符号名里头甚至不包括“foo”。 其中一个问题是,C++标准(目前是[ISO14882])并没有定义名字必须如何被mangle,所以每个编译器都按自己的方式来进行name mangling。有些编译器甚至在不同版本间更换mangling算法(尤其是g++ 2.x和3.x)。即使您搞清楚了您的编译器到底怎么进行mangling的,从而可以用dlsym调用函数了,但可能仅仅限于您手头的这个编译器而已, 而无法在下一版编译器下工作。 解决方案 extern “C” C++有个特定的关键字用来声明采用C binding的函数:extern “C” 。 用 extern “C”声明的函数将使用函数名作符号名,就像C函数一样。因此,只有非成员函数才能被声明为extern “C”,并且不能被重载。尽管限制多多,extern “C”函数还是非常有用,因为它们可以象C函数一样被dlopen动态加载。冠以extern “C”限定符后,并不意味着函数中无法使用C++代码了,相反,它仍然是一个完全的C++函数,可以使用任何C++特性和各种类型的参数。 示例程序1. 加载简单函数 目录结构 示例程序1在test1目录下,这个例子也主要是参考第一篇博客写的。有一些修改。 main.cpp的代码如下 [cpp] //———- //main.cpp: //———- #include #include int main() { using […]