danifelpedro/datasource

简单的 PDO 包装器

dev-master 2016-02-23 19:52 UTC

This package is not auto-updated.

Last update: 2024-09-18 17:33:21 UTC


README

关于 PDO 的类,旨在简化一些基本任务。

安装

composer danielfpedro/datasource

开始

use Datasource\Connection;

$config = [
	'default' => [
		'type' => 'mysql',
		'host' => 'localhost',
		'dbname' => 'blog',
		'username' => 'root',
		'password' => '',
		'charset' => 'utf8',
	]
];

$conn = new Datasource($config['default']);

原始查询

$artigos = $conn
	->rawQuery('SELECT * FROM artigos')
	->go()
	->all('assoc');

foreach($artigos as $artigo){
	echo $artigo['titulo'];
}

获取

使用 allfirstcolumn 来执行数据获取操作,并将任何 PDOconstante(别名 PDO::FETCH_ASSOC)、assocobj(别名 PDO::FETCH_OBJ)作为参数传递。

$artigos = $conn
	->rawQuery('SELECT * FROM artigos')
	->go()
	->all('obj');

foreach($artigos as $artigo){
	echo $artigo->titulo;
}

$artigo = $conn
	->rawQuery('SELECT * FROM artigos')
	->go()
	->fisrt('obj');

echo $artigo->titulo';

原始查询 使用 prepared statement,如果您使用任何 placeholder,请在使用 ::go() 时提供相应的值,例如:

$conn
	->rawQuery('SELECT * FROM artigos WHERE id = :id')
	->go(['id' => 1]);

插入

<form mehotd="POST">
	<input type="text" name="titulo">
	<textarea name="texto"></textarea>
</form>
$conn
	->insertInto('artigos')
	->values($_POST)
	->go();

防止攻击

一个非常常见的做法是将 HTML 表单字段的名称与数据库字段名称相同,然后在 insert 中仅将 $_POST 作为值提供。

现在假设您有一个名为 artigos 的表,默认情况下字段 ativo 的值为 0,即所有插入的文章都处于非活动状态,直到审稿人检查并决定是否发布。

一个恶意用户可以轻易地在表单中注入一个文本字段并命名为 ativo,因此他添加的文章将被保存为 1,从而绕过默认值。

为了防止这种攻击,您可以指定要保存哪些字段。

<form mehotd="POST">
	<input type="text" name="titulo">
	<textarea name="texto"></textarea>
	<input type="text" name="ativo" value="1"><-- Injetado -->
</form>
$conn
	->insertInto('artigos')
	->values($_POST, ['titulo', 'texto']) // Apenas título e texto serão salvos.
	->go();

更新

$conn
	->update('artigos')
	->set(['texto' => 'Boa noite.'])
	->where('id', 1)
	->go();

删除

$conn
	->deleteFrom('artigos')
	->where('id', 1)
	->go();

注意: where 仅接受一个条件,如果您需要更复杂的条件,则必须使用 rawQuery

获取器

  • ::bindValues() - 用于 bind 的值
  • ::query()
  • ::info() - 最后一次 ::go()QueryBind
  • ::rowsAffected() - 影响的行数
  • ::lastInsertId() - 最后插入的 ID

助手

$data = ['titulo' => 'Olá', 'texto' => 'Bom dia.', 'dt_cadastro' => Datasource::now()];