質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

Q&A

解決済

1回答

2543閲覧

laravel5.4.30 SQL文を実行したい

nnahito

総合スコア2004

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

0グッド

1クリップ

投稿2017/07/30 02:39

編集2017/07/30 02:40

はじめに

Laravel初心者です。始めたばかりです。
というよりも、フレームワーク初心者です。
初フレームワークです。

質問

Laravel5.4.30で、SQL文をベタで書きたいがエラーが発生して困っています。

php

1var_dump(DB::select('select * from user where name like "%?%"',['佐藤'])); 2exit();

SQLSTATE[HY000]: General error: 25 bind or column index out of range

これは何故でしょうか?
なお、これはコントローラーに書いております。

コードはこちらを参考に書いております。
↓引用もとコード

$results=DB::select('select * from users where id=?',['1']);

LaravelではDBアクセスをするときに、ORM?と言うものを使わなければいけないのでしょうか?
10年以上SQLをベタで書いてきている私は、今まで書いたSQLをLaravelに移行させるのにORMを使うのが面倒で……
ご存知の方がいらっしゃいましたら、ご教示ください。
お願い致します。


また、プレースホルダーを、「?」ではなく、「:id」のように記述することは可能でしょうか。
こちらもご存知でしたら、ご教示ください。
よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fagai

2017/07/30 02:59

DB::select('select * from user where name like "%?%"',['佐藤'])ではなくDB::select('select * from user where name like ?',['%佐藤%'])ではどうでしょうか?
guest

回答1

0

ベストアンサー

修正依頼に書いてしまったのですが、ちょっと幾つか補足を兼ねて。

DB::select('select * from user where name like "%?%"',['佐藤'])ではなくDB::select('select * from user where name like ?',['%佐藤%'])ではどうでしょうか?
Laravelは内部的にPDOを利用しており、bindValueを利用してバインディングを行っているので、SQL内でダブルクォーテーションでくくる必要はないと思います。

ORMを利用するかに関しては、使わなくて大丈夫です。(ORMを基本とする機能は使えなくなってしまいますが。。。)
特に既存サービスの移行等の場合はORMに適応させる作業自体に時間がかかってしまうため、あまりやらないと思います。

また、名前付きプレースホルダを利用したいとのことですが、恐らく思われている通りの書き方で動作します。

DB::select('select * from user where name like :name',['name' => '%佐藤%'])

こんな感じですね。

Laravel内部ではこんな感じにbindingをやってます。

foreach ($bindings as $key => $value) { $statement->bindValue( is_string($key) ? $key : $key + 1, $value, is_int($value) ? PDO::PARAM_INT : PDO::PARAM_STR ); }

投稿2017/07/30 03:08

編集2017/07/30 03:09
fagai

総合スコア2158

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nnahito

2017/07/30 03:18

おおお!!動きましたありがとうございます!! %の位置、そちらなんですね…… また、プレースホルダーもありがとうございます! > Laravel内部ではこんな感じにbindingをやってます。 なるほど……何となく分かるような、わからないような…w
fagai

2017/07/30 03:22

bindの部分は、$stmtにはPDOstatementが入っています。 ?でバインドした時は、配列がbindingsで入っているはずなので、そのkey+1して入れています。名前付きプレースホルダの場合はbindingsが連想配列なのでkeyは文字列です。 is_intで判定しているところは中身が数値か文字かでバインドされ方が変わるのでそれを判定してますね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問