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

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

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

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

Q&A

4回答

1119閲覧

[PHP]関数の返り値について

newyee

総合スコア213

PHP

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

0グッド

0クリップ

投稿2017/11/10 12:39

php

1function insert_cart($link, $user_id, $item_id){ 2 3 $date = date("Y/m/d H:i:s"); 4 5 6 $sql = 'INSERT INTO cart_table( 7 user_id, 8 item_id, 9 amount, 10 created_date 11 ) VALUES ( 12 '. $user_id . ', 13 ' . $item_id . ', 14 1, 15 \'' . $date . '\')'; 16 17 18 return !(mysqli_query($link,$sql) === FALSE); 19 20}

上記の関数の、returnの部分が良く分からないのですが、mysqli_queryを実行した結果、FALSEでなかったらTRUEを返すという解釈で合っていますでしょうか...?

php

1return !(mysqli_query($link,$sql) === FALSE);

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

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

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

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

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

guest

回答4

0

mysqli_queryを実行した結果、FALSEでなかったらTRUEを返す

そうなんですが、いかにもパッと見で分かりにくいですよねえ。

return !(query($arg) === FALSE);

PHPに限らず、上のような書き方は、リファクタリングしたくなります。

return (query($arg) === TRUE);

「リターン値はクエリがTUREならTURE」と読み下せて、分かりやすい。

return query($arg);

なおもし、queryの返り値が1や0とかではなく、
直接TUREかFALSEを返してくる場合なら、
そのまま渡した方が簡潔になります。

というかそもそも、queryの返り値を
TUREかFALSEの二値で返すように書けば、
他の部分もみんな上のように簡潔に書けて良いと思います。

逆に、二値ではダメで、結果が1ならそのまま変数に足す
部分とか他にあると支障をきたすかもしれませんが、
そもそも、そういうのもリファクタリング対象です。

細かいことですが、こういう改善を積み重ねると、
読みやすいコードになっていくので地味に大事です。

投稿2017/11/10 18:45

LLman

総合スコア5592

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

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

newyee

2017/11/11 08:16

ご丁寧なご回答ありがとうございます。 ご回答下さったこの部分なのですが、「return query($arg);」これを、僕がご質問させて頂いた、コードに当てはめさせて頂きますと、「return (mysqli_query($link,$sql));」となるかと思いますが、これの返り値と致しましては、クエリを実行した結果「TRUE」だった場合には「TRUE」を返す、という理解で合っていますでしょうか...?
LLman

2017/11/11 09:20

>「return (mysqli_query($link,$sql));」 >クエリを実行した結果「TRUE」だった場合には「TRUE」を返す 関数の返り値そのままリターンで返すので、TUREならTUREです。 しかし、論理演算子を外すと二値ではなくなるので、 関数が二値以外を返す場合、【結果が変わって】しまいます! たとえば、1とか2を返すとか、オブジェクトを返すとか……。 だから、一般論として展開するために、わざわざ別の例に書き換えたわけです。 そして、一番目と二番目は論理的に等価ですが、三番目は違うのです。だから、 三つ目のサンプルコードだけ出さずに、注意書きも後半に書いておいたわけです。 そういう結果が変わってしまう場合があるので、 リファクタリングをするときは、壊さないよう、同時にテストを行いましょう。
guest

0

このコードはユーザーが不正な値を入力した場合、SQLインジェクションという脆弱性を発生させてしまいます。
そういう場合は

  1. mysqli_prepare 関数を用いてパラメータを疑問符(?)にする
  2. mysqli_stmt_bind_param 関数を用いてユーザー入力をエスケープする
  3. mysqli_stmt_execute 関数でSQLを実際に実行する
  4. mysqli_stmt_bind_result関数を呼び出して実行結果を取得する
  5. mysqli_stmt_close関数を呼び出してプリペアステートメントを終了

php

1<?php 2 3function insert_cart($link, $user_id, $item_id){ 4 5 $date = date("Y/m/d H:i:s"); 6 7 $result = null; 8 9 $parameters = [ 10 'user_id' => $user_id, 11 'item_id' => $item_id, 12 'amount' => 1, 13 'created_date' => $date 14 ]; 15 16 $sql = 'INSERT INTO cart_table SET '; 17 foreach($parameters as $column_name => $value) { 18 $sql .= sprintf('`%d` = ?, ', $column_name); 19 } 20 $sql = preg_replace('/,\s$/', '', $sql); 21 22 if ($stmt = mysqli_prepare($link, $sql)) { 23 foreach(array_values($parameters) as $param) { 24 mysqli_stmt_bind_param($stmt, 's', $param); 25 } 26 mysqli_stmt_execute($stmt); 27 mysqli_stmt_bind_result($stmt, $result); 28 } 29 mysqli_stmt_close($stmt); 30 return $result; 31}

$sql = preg_replace('/,\s$/', '', $sql);としているのは、ループするとカンマとスペースが入って文字列が生成されるため、それを詰めるための処理です。

投稿2017/11/15 00:32

naohiro19_

総合スコア178

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

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

0

これどこで見たコードですか?
どこかのサイトか本なら参考にしないほうがいいです。

投稿2017/11/10 13:53

kawax

総合スコア10377

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

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

0

!
は論理否定演算子ですので
mysqli_query($link,$sql)
がFALSEでなければTRUEを返しますね

http://php.net/manual/ja/language.operators.php
! ( 論理否定演算子)

投稿2017/11/10 13:24

rururu3

総合スコア5545

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問