facebook twitter hatena line email

「Php/codeigniter/db」の版間の差分

提供: 初心者エンジニアの簡易メモ
移動: 案内検索
(SQLの実行)
(SQLバインド)
行89: 行89:
  
 
==SQLバインド==
 
==SQLバインド==
基本的にはSQLエスケープよりは、バインドを使うほうが良さそう。
+
セキュリティを考慮するとSQLエスケープよりは、バインドを使うほうが良い。
 
  $sql = "SELECT * FROM users WHERE id IN ? AND code = ? AND age = ?";
 
  $sql = "SELECT * FROM users WHERE id IN ? AND code = ? AND age = ?";
 
  $this->db->query($sql, array(array(1, 6), 'taro', 10'));
 
  $this->db->query($sql, array(array(1, 6), 'taro', 10'));

2024年11月10日 (日) 03:38時点における版

db自動接続

application/config/autoload.php

- $autoload['libraries'] = array();
+ $autoload['libraries'] = array('database');

手動接続

以下でデフォルトのdbに接続

$this->load->database();

db設定

application/config/database.php

以下デフォルト設定

$db['default'] = array(
	'dsn'	=> '',
	'hostname' => 'localhost',
	'username' => '',
	'password' => '',
	'database' => '',
	'dbdriver' => 'mysqli',
	'dbprefix' => '',
	'pconnect' => FALSE,
	'db_debug' => (ENVIRONMENT !== 'production'),
	'cache_on' => FALSE,
	'cachedir' => '',
	'char_set' => 'utf8',
	'dbcollat' => 'utf8_general_ci',
	'swap_pre' => '',
	'encrypt' => FALSE,
	'compress' => FALSE,
	'stricton' => FALSE,
	'failover' => array(),
	'save_queries' => TRUE
);

PDOを使う場合は以下の通りdnsを設定する

'dsn'	=> 'mysql:host=localhost;dbname=mydatabase',

usernameと、passwordと、databaseを設定する。

'username' => '',
'password' => '',
'database' => '',

"No database selected"とエラーが出る場合

application/config/database.php

'database' => ,

が空になってないか確認する。

SQLの実行

参照

$this->db->query("select * from users");

挿入

$this->db->query("insert into users(code, name, age) values('taro', 'taro!', 10);");
$this->db->query("insert into users(code, name, age) values('jiro', 'jiro!', 8);");

削除

$this->db->query("delete from users where code ='jiro';");

使用したtable定義

drop table users;
create table users(
id int(11) unsigned NOT NULL AUTO_INCREMENT,
code varchar(15),
name varchar(15),
age int(11) unsigned,
PRIMARY KEY(id),
UNIQUE KEY `code` (`code`)
);

"Message: syntax error, unexpected identifier"エラーが出る時

SQL文字列を'(シングルクウォート)で囲むと、SQL文の'とかぶるので、SQLは"(ダブルクウォート)で囲む

SQLエスケープ処理

シングルクウォートを自動でつける

$sql = "INSERT INTO users (code) VALUES(".$this->db->escape($code).")";

検索時の対応は、シングルクウォートをつけられないので、escape_like_str()を使う

$sql = "SELECT * FROM users (code) LIKE '%" .".$this->db->escape_like_str($search)."%'";

SQLバインド

セキュリティを考慮するとSQLエスケープよりは、バインドを使うほうが良い。

$sql = "SELECT * FROM users WHERE id IN ? AND code = ? AND age = ?";
$this->db->query($sql, array(array(1, 6), 'taro', 10'));

公式

https://codeigniter.jp/user_guide/3/database/connecting.html