タグ

PDOに関するiwwのブックマーク (29)

  • PDOフェッチパターン大全 - Qiita

    忙しい人向け Q. PDO::FETCH_ASSOCでフェッチするとき,キーを整数連番じゃなくてidにする方法は? A. PDO::FETCH_UNIQUEを組み合わせる. $sql = "SELECT id, * FROM people WHERE gender = 'female'"; $rows = $pdo->query($sql)->fetchAll(PDO::FETCH_ASSOC|PDO::FETCH_UNIQUE); var_dump($rows); /* [ 3 => ['id' => '3', 'name' => 'Lucy', 'gender' => 'female'], 5 => ['id' => '5', 'name' => 'Mary', 'gender' => 'female'], ] */

    PDOフェッチパターン大全 - Qiita
    iww
    iww 2019/05/09
    大全ってなんだよ
  • PDOのサンプルで数値をバインドする際にintにキャストしている理由

    先日PHPカンファレンス北海道2016にて「『例えば、PHPを避ける』以降PHPはどれだけ安全になったか」と題して基調講演を担当致しました。その際のスライドはこちら。 そうしたところ、以下のご指摘をいただきました。 @ockeghem スライド拝見しました。39番目のスライドですが、バインドのタイミングでintにキャストするのはちょっと例として良くない気がします。意図的にオーバーフローを起こすことで想定外のレコードの取得を許してしまいそうです。キャストしない方がまだ安全だと思うのですが。 SQLデータベースは、int型よりも大きな桁数を扱える場合があるので、intへのキャストを避けた方がよいという指摘は一般論としてはもっともなものだと考えます。PHPの場合、9223372036854775807を越える数字文字列をint型にキャストすると、9223372036854775807が返ります(

  • PHP: “There is no active transaction” というエラー – BmathLog

    Zend で の PDO_Mysql を使っていたら “There is no active transaction” という例外を吐いて止まった。 $dbAdapter = $this->_registry["zdb_adapter"]; $dbAdapter->beginTransaction(); try{ $manager->save(); // DB保存処理 }catch(Exception $e){ $dbAdapter->rollback(); } $dbAdapter->commit(); ん〜???とよく見たら rollback() したあと、そこで処理が停止しないで commit() しようとしてる。これが原因。 $dbAdapter = $this->_registry["zdb_adapter"]; $dbAdapter->beginTransaction(); t

    iww
    iww 2015/10/19
    There is already an active transaction
  • PHP: PDOException - Manual

    Here is something interesting regarding a PDOException and it involves some of the annoyances that can be associated with PHP's dynamic nature. PDOException extends from RuntimeException, which in return extends from Exception. As such, it has access to the $code Protected Class Variable, which represents the Exception's code as an Integer (duh!) and can be accessed externally using the Exception:

  • 【php】PDO::errorInfo()の動きの確認 at softelメモ

    問題 PDO::errorInfo() で、ドライバ固有のエラーコードを見るようにしてたら何かおかしい。 答え PDOを使うようになったらSQLSTATE(戻り値の配列の1つ目の値)を見るのがオススメのようですね。 SQLのエラーの詳細は mysql_errno()などを利用していたソースをPDOに移行するときなどは、ドライバ固有のエラーコードを見ると簡単そうだと考えてしまいますが、MySQLでPDO::errorInfo()を使ったら以下のような動きでした。 $db = new PDO('mysql:host=localhost;dbname=test', 'user', 'password'); //例えば重複エラーが発生するSQL var_dump($db->exec('insert into t (id) values (1)')); var_dump($db->errorInfo

    【php】PDO::errorInfo()の動きの確認 at softelメモ
  • PHP: PDOStatement::fetchObject - Manual

    Getting Started Introduction A simple tutorial Language Reference Basic syntax Types Variables Constants Expressions Operators Control Structures Functions Classes and Objects Namespaces Enumerations Errors Exceptions Fibers Generators Attributes References Explained Predefined Variables Predefined Exceptions Predefined Interfaces and Classes Predefined Attributes Context options and parameters Su

    iww
    iww 2015/04/30
    失敗したら例外でもnullでもなく、FALSE。 よりにもよって、FALSE
  • [PHP][PDO][SQL] IN句のbindを簡単に作成する。

    PHPからPDOでIN句を含むSQLを発行するとき IN(?,?,?,?)やIN(:in_1,:in_2,:in_3) と検索する個数分「?」なり「:in_1」なりを書かないといけない。 個数が固定であれば直書きでもいいが、checkboxから飛んできたデータなど、 不定であることが多い。 もちろんforやforeachなどループで回せば書くことはできるが少々面倒臭い。 そういう時は //idに対してこういうデータで検索条件の値が飛んでくるとする $data=array(2,7,14,23); $sql=''; $where=array(); $sql.="SELECT * FROM table WHERE flag=?"; $where[]=$flag; $sql.=" AND id IN(".substr(str_repeat(',?',count($data)),1).")"; $w

    iww
    iww 2014/11/05
    ? を動的に増やす
  • 【PDO】bindParamとbindValueの違い【PHP】 | WEBマスターの知恵ブログ

    bindParamとbindValueの違いについての覚書です。 bindValue : 値をパラメータにバインドする プリペアドステートメントで使用する SQL 文の中で、対応する名前あるいは疑問符のプレースホルダに値をバインドします。 bindParam : 指定された変数名にパラメータをバインドする 準備された SQL ステートメント中で、   対応する名前もしくは疑問符プレースホルダにパラメータをバインドします。   PDOStatement::bindValue() と異なり、   変数は参照としてバインドされ、PDOStatement::execute()がコールされたときのみ評価されます。 PHPマニュアルの該当箇所には、このような説明があります。 ただ、これだけでは何のことかイマイチ分かりません。 この二つで分かりやすいのは、単純な動作のbindValueです。 基的な動

    iww
    iww 2014/08/09
    忘れてたのでメモ
  • PHP: 定義済み定数 - Manual

    <?php if ($db->getAttribute(PDO::ATTR_DRIVER_NAME) == 'mysql') { echo "mysql 上で動作しています。何か mysql 固有のことをここで行います\n"; } ?> PDO::ATTR_ORACLE_NULLS (int) 空文字を SQL の NULL 値に変換します。 PDO::ATTR_PERSISTENT (int) 新規接続を生成するよりもむしろ持続的接続を要求します。 PDO::ATTR_STATEMENT_CLASS (int) Sets the class name of which statements are returned as. PDO::ATTR_FETCH_CATALOG_NAMES (int) 結果セット中の各カラム名にカタログ名を追加します。 カタログ名とカラム名は、小数点 (.) で

    iww
    iww 2014/08/09
  • スクロール可能なカーソルとは?

    What is PDO scrollable cursor? PDO の prepare メソッドのマニュアルに次のオプションが指定されているが、カーソルとは何かの説明がなかったので、検索したら stackoverflow の回答がでてきた。 $sth = $dbh->prepare($sql, [PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY]); スクロール可能なカーソルはイテレーションの巻き戻しが可能であり、同じ列に複数回アクセスできる。スクロール可能ではないカーソルはフォワードオンリーとしても知られ、列のフェッチは一度だけである。最後の列を取得すると SQLSTATE 02000 が返される。 PDO の定義済みの定数の説明では次のように書かれている。 PDO::CURSOR_FWDONLY は「前進のみ可能なカーソルを有する PDOStatemen

    スクロール可能なカーソルとは?
    iww
    iww 2014/08/09
    PDO::ATTR_CURSORにPDO::CURSOR_SCROLLとか設定する話
  • PHP: プリペアドステートメントおよびストアドプロシージャ - Manual

    より成熟したデータベースの多くは、プリペアドステートメントという 概念をサポートしています。プリペアドステートメントとはいったい何の ことでしょう? これは、実行したい SQL をコンパイルした 一種のテンプレートのようなものです。パラメータ変数を使用することで SQL をカスタマイズすることが可能です。プリペアドステートメントには 2 つの大きな利点があります。 クエリのパース (あるいは準備) が必要なのは最初の一回だけで、 同じパラメータ (あるいは別のパラメータ) を指定して何度でも クエリを実行することができます。クエリを実行するには、準備として クエリの解析やコンパイル、そして実行プランの最適化が行われます。 クエリが複雑になると、この処理には時間がかかるようになります。 同じクエリを異なったパラメータで何度も実行すると、アプリケーションの 動作は目に見えて遅くなるでしょう。

    iww
    iww 2014/06/19
    出力パラメータを指定してストアドプロシージャをコール
  • PDOでエラー表示をする.PDOの例外をエラーメッセージを表示する - それマグで!

    PHPはエラー表示しない」のが標準設定らしいです.初心者や使うだけの人がWarningsを見せられても意味わかんないって事らしいんですけど、チョッとしたデバッグでも不便です. PDOのSQL周りのエラーでExceptionにして欲しい $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); PDOを使うとExceptionが出てこない. PDOをつかっていると、Prepare後にExecuteしたらなぜかうまくいかないことがある.原因を表示してくれると助かるのですが. PDO::ERRMODE_SILENT デフォルトのモードです。 エラーを取得するには PDO::errorCode() および PDO::errorInfo() メソッドを使用します。つまりエラーがでて失敗したらPDO::errorInfo()を見て下

    PDOでエラー表示をする.PDOの例外をエラーメッセージを表示する - それマグで!
  • PHP: PDOStatement::fetchAll - Manual

    Getting Started Introduction A simple tutorial Language Reference Basic syntax Types Variables Constants Expressions Operators Control Structures Functions Classes and Objects Namespaces Enumerations Errors Exceptions Fibers Generators Attributes References Explained Predefined Variables Predefined Exceptions Predefined Interfaces and Classes Predefined Attributes Context options and parameters Su

    iww
    iww 2013/03/29
    ゼロ件は空の配列を返す(超重要)
  • MySQL を PDO で使うときは ATTR_EMULATE_PREPARES を設定しよう : DSAS開発者の部屋

    「DSAS for Social を支える技術」 というネタでadvent calendar に挑戦します。 methane です。 PDOで MySQL を使うときは、みなさん $stmt = $con->prepare("..."); して $stmt->execute($values); とかしてプリペアドステートメントを利用されていると思います。 実は、このプリペアドステートメント、パフォーマンス的にはあまり良くありません。1つのクエリを実行するために、プレースホルダ付きのクエリを投げた後に、それに値をバインドして実行するコマンドを投げるので、1回のクエリを実行するのに2往復の通信が必要になるのです。 プリペアドステートメントにはパフォーマンスの利点(同じクエリを何度も発行するときにDBサーバーがクエリの解析を繰り返さないでもすむ)というものと、SQLインジェクション対策になる(正

    MySQL を PDO で使うときは ATTR_EMULATE_PREPARES を設定しよう : DSAS開発者の部屋
    iww
    iww 2011/12/21
    PDO::ATTR_EMULATED_PREPARE
  • http://www.favorite-labo.org/view/101

    iww
    iww 2011/10/08
    『bindValue() で値を指定してから execute() を実行するようにすればLIMIT句でも大丈夫』 こんな手があるとは
  • PHP: MySQL (PDO) - Manual

    はじめに PDO_MYSQL は、PHP から MySQL データベースへのアクセスを可能にするための PHP Data Objects (PDO) インターフェイス を実装したドライバです。 PDO_MYSQLは、 デフォルトでエミュレートされたプリペアドステートメントを使います。 MySQL 8 PHP 7.1.16 より前のバージョン、もしくは PHP 7.2.4 より前の 7.2系の PHP では、 MySQL 8 サーバーのデフォルトパスワードプラグインを mysql_native_password に設定するようにしてください。 さもないと、 The server requested authentication method unknown to the client [caching_sha2_password] のようなエラーを見ることになります。たとえあなたが cach

    iww
    iww 2011/02/28
    --with-pdo-mysql
  • PHP と MySQL と サーバサイド プリペアードステートメント - do_aki's log

    少し前のお話なのだけど、せっかくなので書いておくことにする。 MySQLのクエリログを見ていたら、 prepare に相当するログが一切流れていないことに気づいたので、PDO(mysql)でサーバサイドプリペアードステートメントが利用されていないんじゃないか疑惑が浮上。 php のバージョンは 5.2.11 mysql は 5.0 系 以下、検証してみた結果と、その対応です。 検証 簡単なソースコードを実行してみて、そのクエリログを見てみることにした。 PDO を利用 $p = new PDO('mysql:dbname=dbname;host=localhost', 'user', 'password'); $stmt = $p->prepare("SELECT * FROM table_name WHERE id=?"); $stmt->execute(array(1)); $stmt

    PHP と MySQL と サーバサイド プリペアードステートメント - do_aki's log
  • PDOとMYSQLの組み合わせでLIMITを使う場合の注意点 » とりあえず9JP

    注意点というほどでも無いかもしれないけど、一度ハマった事があるので・・・。 $sql = "SELECT * FROM example_tbl WHERE name=? age=?"; $sth = $dbh->prepare($sql); $sth-> execute(array('あいうえお' , 18)); という感じで配列で渡すと非常に手軽だけれど・・・ $sql = "SELECT * FROM example_tbl WHERE name=? age=? LIMIT ?,?"; $sth = $dbh->prepare($sql); $sth-> execute(array('あいうえお' , 18, 0, 30)); といった感じでLIMITの値を渡すとエラーが出る。 配列で渡す場合、全て文字列として渡すらしく、LIMITに文字列を渡してしまった事が原因らしい。 なので、LI

    iww
    iww 2010/10/21
    PDO::PARAM_INT を使うといいのか。 なるほど!
  • ぼくがPDOを採用しなかったわけ(Shift_JISによるSQLインジェクション)

    補足 この記事は旧徳丸浩の日記からの転載です。元URL、アーカイブはてなブックマーク1、はてなブックマーク2。 備忘のため転載いたしますが、この記事は2010年7月1日に公開されたもので、当時の徳丸の考えを示すものを、基的に内容を変更せずにそのまま転載するものです。 補足終わり PHPのデータベース・アクセス・ライブラリPDOは、DB接続時の文字エンコーディング指定ができないため、文字エンコーディングの選択によっては、プレースホルダを使っていてもSQLインジェクション脆弱性が発生します。 追記(2011/06/19) ここに来て急にブクマが追加されはじめていますが、このエントリを書いてから状況が改善しています。PHP5.3.6(2011/03/17)にて、PDOでもデータベース接続の文字エンコーディングを指定できるようになりました。この版で、UNIX版のPHPでは解決しましたが、Win

    ぼくがPDOを採用しなかったわけ(Shift_JISによるSQLインジェクション)
  • PDO 関数

    導入 PHP Data Objects (PDO) 拡張モジュールは、 PHP の中からデータベースにアクセスするための軽量で高性能な インターフェイスを定義します。 PDO インターフェイスを実装する各データベースドライバは、 正規表現関数のようなデータベース固有の機能を提供することができます。 PDO 拡張モジュールによりそのデータベースの全てのデータベース関数を 実行できるわけではないことに注意してください。 データベースサーバにアクセスするには、 データベース固有の PDO ドライバ を使用する必要があります。 PDO は、データアクセスの抽象化レイヤを提供します。 つまり、使用しているデータベースが何であるかにかかわらず、同じ 関数を使用してクエリの発行やデータの取得が行えるということです。 PDO は、データベースの抽象化を行うのでは ありません。つまり、SQL を書き直したり