プロが教えるわが家の防犯対策術!

PHPで、以下のようなソースで、存在しているデータベースtestに接続し、もしない場合、name_listというテーブルを作り、1カラム目をカラム名がnoで、int型でnot null auto_incrementにして、2カラム目をカラム名がnameで、not nullで作りたいのですが、うまくテーブルが作られません。
どうすればうまく作られるか教えてください。

<?php
try{
$pdo = new PDO('mysql:dbname=test; host=localhost; charset=utf8', 'root');
$st = $pdo->prepare("create table if not exists name_list (no int(100) not null auto_increment, name varchar(100) not null);");
$st->execute();
}catch(PDOException $e){
print('Error:'.$e->getMessage());
die();
}

A 回答 (5件)

PRIMARY KEYを設定してください。



create table if not exists name_list (no int(100) not null auto_increment PRIMARY KEY, name varchar(100) not null)


ところで、、、
以前、create table if not existsというクエリを流せばいいと回答しましたが、
サーバサイドで動かしているプログラムは基本的にテーブルありきで実装すると思います。
ですからIF NOT EXISTSというようにするというのはちょっとおかしいかな?と思いました。
    • good
    • 0
この回答へのお礼

PRIMARY KEYを設定したら、table作ることできました。
IF NOT EXISTSでテーブルを作成する件ですが、PHPから色々とMySQLを操作する練習をしていまして、やろうと思いました。
実際に使用する際は、プログラム側でtableは作らないようにいたします。
ありがとうございます。
ついでなのですが、create tableするときに、テーブルと特定のカラムのデフォルトエンコードをutf-8に設定する方法を教えていただければありがたいです。
よろしくお願いします。

お礼日時:2014/10/20 22:44

1点補足



utf8_unicode_ciの場合、半角全角の違いや、濁音半濁音の違いなども
吸収してしまうので注意してください。

半角「a」で検索して全角「A」がヒットしたり、
濁音「ば」で検索して「は、ぱ」やカタカナ「ハ、バ、パ」や半角「ハ」が
(※この掲示板だと勝手に変換されるので半角にみえませんが)
ヒットしたりします。

またLIKEを使うと微妙にヒットする値が違ったりするのも要注意です。
    • good
    • 0
この回答へのお礼

utf8_unicode_ciについての詳しいご説明ありがとうございます。

お礼日時:2014/10/28 19:33

>COLLATEというのが、何の設定か教えていただけると幸いです。



文字コード(キャラクターセット)に対して、マッチさせるブレを調整する属性です。
文字コードはUTFだったりシフトJISだったりEUC(UJIS)だったりするアレです。
検索する際には、たとえば英字だったら大文字小文字を同じとみるか違うとみるか
日本語だったらひらがなとカタカナを同じとみるか違うとみるか調整できます。

以下サンプル
//元データ作成
create table tbl (
id int not null auto_increment primary key
,data_gen varchar(100) character set utf8 collate utf8_general_ci
,data_uni varchar(100) character set utf8 collate utf8_unicode_ci
,data_bin varchar(100) character set utf8 collate utf8_bin
) engine = innodb default character set utf8 COLLATE utf8_general_ci;

insert into tbl(id,data_gen,data_uni,data_bin)
values(1,'aaa','aaa','aaa')
,(2,'AAA','AAA','AAA')
,(3,'あああ','あああ','あああ')
,(4,'アアア','アアア','アアア');

//以下検索
select * from tbl where data_gen='aaa';//→1,2がヒット
select * from tbl where data_uni='aaa';//→1,2がヒット
select * from tbl where data_bin='aaa';//→1のみヒット

//generalやunicodeは英字のブレを吸収し、binは厳密に比較します。

select * from tbl where data_gen='あああ';//→3のみヒット
select * from tbl where data_uni='あああ';//→3,4がヒット
select * from tbl where data_bin='あああ';//→3のみヒット

//unicodeは日本語のブレを吸収し、generalやbinは厳密に比較します。

どれが優秀ということではなく、用途によってcollateを適宜設定してください
そうでないと想定とちがうものがヒットしたり、ヒットしなかったりすることになるでしょう
    • good
    • 0
この回答へのお礼

とても詳しいご説明ありがとうございます。
大変よくわかりました。

お礼日時:2014/10/28 19:33

>create tableするときに、テーブルと特定のカラムのデフォルトエンコードをutf-8に設定する方法



hogehoge varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci

を指定してあげてください
COLLATEはutf8_unicode_ciでもよいでしょう(拡張方法が若干違う)

総じてこんな感じ
create table if not exists name_list (
no int(100) not null auto_increment PRIMARY KEY
, name varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci not null)
engine = innodb DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci

この回答への補足

ありがとうございます。
教えていただいたやり方で成功しました。
COLLATEというのが、何の設定か教えていただけると幸いです。

補足日時:2014/10/23 23:10
    • good
    • 0
この回答へのお礼

ありがとうございます。

お礼日時:2014/10/28 19:34

PDOでtry~catchでエラーを拾うのは通常は接続エラーだけです。


SQLの文法エラーは無視されるのでcatchに処理がながれません。
文法エラーが拾いたければエラーモードの設定までしてください


<?php
try{
$dsn = 'mysql:host=localhost; dbname=test';
$user = 'root';
$password = '・・・・';
$pdo = new PDO($dsn, $user,$password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$query="create table if not exists name_list (`no` int(100) not null auto_increment, `name` varchar(100) not null);";
$st = $pdo->query($query);
}catch(PDOException $e){
die($e->getMessage());
}
?>

テーブル作るのにプリペアド処理はいらないので普通にquery()を実行すればいいでしょう
上記だとエラーが表示されるはずです。

エラー内容については#1さんが指摘の通り、オートインクリメントするカラムには
最低でもuniqueな属性が必要です。
通常オートインクリメントする理由はレコードへ一意なアクセスをするためですので
プライマリーキーとして処理するのが妥当です。
    • good
    • 0
この回答へのお礼

文法エラーまで表示するのであれば、エラーモードの設定までする件ありがとうございます。
オートインクリメントするカラムには最低でもuniqueな属性が必要なんですね。
いろいろと詳しくありがとうございます。

お礼日時:2014/10/20 22:39

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!