十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
怎么获得mysql以pdo方式的数据库连接变量
为临洮等地区用户提供了全套网页设计制作服务,及临洮网站建设行业解决方案。主营业务为网站设计制作、做网站、临洮网站设计,以传统方式定制建设网站,并提供域名空间备案等一条龙服务,秉承以专业、用心的态度为用户提供真诚的服务。我们深信只要达到每一位用户的要求,就会得到认可,从而选择与我们长期合作。这样,我们也可以走得更远!
// 数据库连接ID 支持多个连接
protected $linkID = array();
// 当前连接ID
protected $_linkID = null;
复制代码
我在使用datatable editor插件的时候,需要为插件配置mysql数据库信息,但是thinkphp已经帮我连接过一次,插件连接的话,插件的
$db = new Database( $sql_details );
复制代码
这里获得$db为空值,
解决办法就是采用pdo连接方式,直接在配置信息的时候把thinkphp的数据库连接变量配置进去
$sql_details = array(
"type" = "Mysql", // Database type: "Mysql", "Postgres", "Sqlite" or "Sqlserver"
"user" = "root", // Database user name
"pass" = "", // Database password
"host" = "localhost", // Database host
"port" = "", // Database connection port (can be left empty for default)
"db" = "XXXX", // Database name
"dsn" = "", // PHP DSN extra information. Set as `charset=utf8` if you are using MySQL
'pdo' = $dbh
);
使用PDO或者MySQLi,有很多封装好的方便的Class。 例如使用PHP-PDO-MySQL-Class · GitHub(这个Class使用上比较类似Python的MySQLdb)的话,这样就是安全的: 直接拼接字符串则是危险的:
INSERT INTO `man_db_write`.`man_articles` (`title`,`content`,`created`) VALUES (:0_title,:0_content,:0_created),(:1_title,:1_content,:1_created)
然后我再PHP中绑定变量
$stmt-bindParam(':0_title','title 1');
$stmt-bindParam(':0_content','content 1');
$stmt-bindParam(':0_created','1418103633');
$stmt-bindParam(':1_title','title 2');
$stmt-bindParam(':1_content','content 2');
$stmt-bindParam(':1_created','1418103635');
$stmt-execute();
首页
站长学院
数据库
MySQL
怎样使用MySQLi和PDO创建MySQL表?
怎样使用MySQLi和PDO创建MySQL表?
发布日期:2015-09-15 17:27 来源: 标签: MySQL数据库 MySQL 创建数据表 PDO
一个数据表有一个唯一名称,并有行和列组成。
PHP 创建 MySQL 表
一个数据表有一个唯一名称,并有行和列组成。
使用 MySQLi 和 PDO 创建 MySQL 表
CREATE TABLE 语句用于创建 MySQL 表。
我们将创建一个名为 "MyGuests" 的表,有 5 个列: "id", "firstname", "lastname", "email" 和 "reg_date":
CREATE TABLE MyGuests (
id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
firstname VARCHAR(30) NOT NULL,
lastname VARCHAR(30) NOT NULL,
email VARCHAR(50),
reg_date TIMESTAMP
)
上表中的注意事项:
数据类型指定列可以存储什么类型的数据。
在设置了数据类型后,你可以为没个列指定其他选项的属性:
NOT NULL - 没一行都必须含有值(不能为空),null 值是不允许的。
DEFAULT value - 设置默认值
UNSIGNED - 使用无符号数值类型,0 及正数
AUTO INCREMENT - 设置 MySQL 字段的值在新增记录时每次自动增长 1
PRIMARY KEY - 设置数据表中每条记录的唯一标识。 通常列的 PRIMARY KEY 设置为 ID 数值,与 AUTO_INCREMENT 一起使用。
每个表都应该有一个主键(本列为 "id" 列),主键必须包含唯一的值。
我把问题和赞同最多的答题翻译了下来。提问:如果用户的输入能直接插入到SQL语句中,那么这个应用就易收到SQL注入的攻击,举个例子:$unsafe_variable = $_POST['user_input']; mysqli_query("INSERT INTO table (column) VALUES ('" . $unsafe_variable . "')");用户可以输入诸如 : value'); DROP TABLE table;-- ,SQL语句就变成这样了:INSERT INTO table (column) VALUES('value'); DROP TABLE table;--')(译者注:这样做的结果就是把table表给删掉了) 我们可以做什么去阻止这种情况呢?回答:使用prepared statements(预处理语句)和参数化的查询。这些SQL语句被发送到数据库服务器,它的参数全都会被单独解析。使用这种方式,攻击者想注入恶意的SQL是不可能的。要实现这个主要有两种方式:1. 使用 PDO:$stmt = $pdo-prepare('SELECT * FROM employees WHERE name = :name'); $stmt-execute(array(':name' = $name)); foreach ($stmt as $row) { // do something with $row }2. 使用 Mysqli:$stmt = $dbConnection-prepare('SELECT * FROM employees WHERE name = ?'); $stmt-bind_param('s', $name); $stmt-execute(); $result = $stmt-get_result(); while ($row = $result-fetch_assoc()) { // do something with $row }PDO需要注意的是使用PDO去访问MySQL数据库时,真正的prepared statements默认情况下是不使用的。为了解决这个问题,你需要禁用模拟的prepared statements。下面是使用PDO创建一个连接的例子:$dbConnection = new PDO('mysql:dbname=dbtest;host=127.0.0.1;charset=utf8', 'user', 'pass'); $dbConnection-setAttribute(PDO::ATTR_EMULATE_PREPARES, false); $dbConnection-setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);上面的例子中,错误报告模式并不是强制和必须的,但建议你还是添加它。通过这种方式,脚本在出问题的时候不会被一个致命错误终止,而是抛出PDO Exceptions,这就给了开发者机会去捕获这个错误。然而第一行的 setAttribute() 是强制性的,它使得PDO禁用模拟的prepared statements并使用真正的prepared statements。这可以确保这些语句和值在被发送到MySQL服务器之前不会被PHP解析(这使得攻击者没有注入恶意SQL的机会)。尽管你可以使用可选的构造函数参数去设置 charset ,但重点需要注意的是小于5.3.6的PHP版本,DSN(Data Source Name)是默认忽略 charset 参数的。说明当你传一个SQL语句做预处理时会发生什么?它被数据库服务器解析和编译了。通过指定参数(通过之前例子中的 ? 或者像 :name 这样的命名式参数)你告诉数据库引擎你是想过滤它。接着当你调用 execute() 函数时,prepared statements会和你刚才指定的参数的值结合。在此重要的是,参数的值是和编译过的语句结合,而非一个SQL字符串。SQL注入就是当创建被发送到数据库的SQL语句时,通过欺骗的手段让脚本去引入恶意的字符串。因此当你使用单独的参数发送真实正确的SQL时,你就限制了被某些不是你真实意图的事情而搞挂掉的风险。使用prepared statements 传递的任何参数都会被当做字符串对待(不过数据库引擎可能会做一些优化,这些参数最终也可能变成numbers)(译者注:意思就是把参数当做一个字符串而不会去做额外的行为)。比如在上面的例子中,如果 $name 变量的值是 'Sarah'; DELETE * FROM employees ,产生的结果是会去搜索"'Sarah'; DELETE * FROM employees"这一整个字符串,最终的结果你也就不会面对的是一张空表了。使用prepared statements的另一个好处是,如果你在同一session中再次执行相同的语句,也就不会被再次解析和编译,这样你就获得一些速度上的提升。
PDO配置。打开php.ini配置文件,找到下图所示的配置信息,去掉要启用的PDO前面的“#”号即可。另外一种方式是直接在启动的wampserver中找到php扩展中的php_pdo_db.lib选项,重启wampserver服务器即可。
如何利用PDO连接数据库。利用下面这条简单的语句即可连接数据库
$pdo = newPDO("mysql:host=localhost;dbname=php100","root",“ ");
其中具体参数介绍如下图所示:
PDO中常用的函数及其解释如下。
PDO::query()主要是用于有记录结果返回的操作,特别是SELECT操作
PDO::exec()主要是针对没有结果集合返回的操作,如INSERT、UPDATE等操作
PDO::lastInsertId() 返回上次插入操作,主键列类型是自增的最后的自增ID
PDOStatement::fetch()是用来获取一条记录
PDOStatement::fetchAll()是获取所有记录集到一个中
下面通过一个简单的php代码示例来具体介绍如何使用PDO进行数据库操作。
?php
//连接数据库
$pdo = new PDO("mysql:host=localhost; dbname=member", "root","");
//在表user_list中插入数据
$pdo-exec("insert into user_list(uid, m_id, username, password) values(null,'3','testpdo','testpdo')");
//使用查询语句
$sr = $pdo-query("select * from user_list");
//将查询的结果循环输出显示
while($row=$sr-fetch()){
print_r($row);
}
?