sqliteでの質問です。

pdoを使用してsqliteを触っていますが以下の場合の日本語での検索指定をどうしたらいいのかがわかりません。
$sql = "SELECT * FROM char WHERE name = :name";
$stmt = $conn->prepare($sql);
$stmt->bindParam(":name", $name);
$stmt->execute();
$row = $stmt->fetch(PDO::FETCH_ASSOC);
var_dump($row);
charテーブルにあるnameから特定人物の洗い出しをしたいのですが、そのまま日本語を指定したらエラーとなります。
この場合の日本語の指定方法を教えてください。

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:
  • 終了:2010/10/30 10:00:03
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答2件)

id:windofjuly No.1

回答回数2625ベストアンサー獲得回数1149

ポイント35pt

ご質問のコードで希望通りの動作となりエラーは出ませんので、

今回のご質問に関しては環境設定のミスマッチが原因と考えられます

 

単純にプログラムファイルをutf-8形式で保存するだけでOKとなるかもしれませんが、

エラーメッセージと環境(OSやphpのバージョンなど)などがありませんので、

同じ状況を作り出したりググったりすることはままならず、まずは以下2点を整理しつつ、

ご自身でも検索等行ってみてください

・sqliteデータベースファイルを作った環境や手順

・php.iniのsqlite関連ならびに文字コード関連

 

情報不足ならびにコメント欄を表示しておられないので以上の簡単な回答でひとまず失礼します

ちなみにテストコードは下記のような具合

<?php
// データ作成
$conn = new PDO('sqlite::memory:');
$conn->exec('CREATE TABLE char (code integer primary key autoincrement, name text)');
$stmt = $conn->prepare("INSERT INTO char (name) VALUES (?)");
$stmt->execute(array('佐藤'));
$stmt->execute(array('田中'));
$stmt->execute(array('高橋'));
foreach ($conn->query('SELECT * FROM char') as $row) {
    echo sprintf('%d %s<br />', $row[0], $row[1]);
}

// 抽出条件
$name = '田中';

// 以下質問文からコピペ
$sql = "SELECT * FROM char WHERE name = :name";
$stmt = $conn->prepare($sql);
$stmt->bindParam(":name", $name);
$stmt->execute();
$row = $stmt->fetch(PDO::FETCH_ASSOC);
var_dump($row);

結果

1 佐藤
2 田中
3 高橋
--------------------
array(2) { ["code"]=> string(1) "2" ["name"]=> string(4) "田中" }

http://php.net/manual/ja/book.pdo.php

http://www.php.net/manual/ja/ini.php

http://www.sqlite.org/lang.html

id:quocard

ありがとうございます。

文字関連を精査することで正常に検索が行えるようになりました。

ちなみにSQLiteについての知識がないのですが、SQLiteには書き込みの制御などは出来ないという認識です。

同時に書き込みがあった場合はテーブルが破損するという考えでいいのでしょうか?

それとも同時に書き込みをしても別テーブルや別カラムであれば同時であっても壊れないという扱いなのでしょうか?

ご存知の方のご指摘宜しくお願いいたします。

2010/10/24 22:40:09
id:windofjuly No.2

回答回数2625ベストアンサー獲得回数1149

ポイント35pt

【Q1】SQLiteには書き込みの制御などは出来ないという認識

いいえ

SQLiteもトランザクションを備えています

http://www.sqlite.org/lang_transaction.html

 

【Q2】同時に書き込みがあった場合はテーブルが破損する

いいえ

明示せずとも暗黙的(≒自動的)にトランザクションが働きますので同時書き込み可能です

(複数のSQLを実行させる場合には明示したほうが高速に処理される場合があります)

http://journal.mycom.co.jp/special/2004/php5/007.html

 

【余談】現実は同時書き込みではない

トランザクション中はファイルロックされて他の人は一時的に待たされる形になりますので、実用的かどうかは下記の様な関係式になります

トランザクション処理時間 x 利用人数 < タイムアウト

ブラウザのタイムアウトは30秒程度ですが、1秒以上待たされると長いと思ってしまう場合もあることでしょうから、

・時間制限1秒として、トランザクション0.1秒/件の状況であれば、同時利用は10人まで

・時間制限1秒として、トランザクション0.01秒/件の状況であれば、同時利用は100人まで

といった概算が成り立ちます

同時接続数を増やしたい場合は、テーブル構成の再考、インデックスの利用やSQL処理の単純化、OSのメモリ割り当て調整、PCの性能アップなどを総合的にやっていく必要がありますが100人ともなればファイルロックではなく行ロックに対応しているMySQLやPostgreSQLなどの利用を考える必要があるでしょう

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません