PHP5 技術者認定試験問題集

#第3章
##P37
■4.
**次のコードを実行した結果として正しいものを選択してください。**

```php:
if(abs(-100) > abs(-50)){
	echo "AAA";
}

if("abc" > "xyz"){
	echo "BBB";
}elseif ("567" < "890"){
	echo "CCC";
}
```

答え→C.
AAACCC

|　　　　　||
|:--|:--|
|**絶対値とは**|その数がどれだけ基準となる数から離れているかを示す大きさ|
|**abs(引数)**|引数の絶対値を返す|
|**アルファベットの大小**|文字列と文字列の比較は一般的にアルファベット順で行われ、アルファベット順で前の文字列は後の文字列に対して「より小さい」と判定される。「abc」は「xyz」より小さい|


[絶対値](http://juken-mikata.net/how-to/mathematics/absolute-value.html)

##P38 文字列　判定と繰り返し
■5.
**次のコードを実行した結果として正しいものを選択してください。**

```php:
if('5member' < 44){
	echo "44";
}else{
	echo "5member";
}
```

答え→A.「44」が表示される

■6.
**次のコードを実行した結果として正しいものを選択してください。**

```php:「Under」が表示される
if(strcmp("54321", "6789") > 0){
	echo "Over";
}else{
	echo "Under";
}
```

|　　　　　　　　　　||
|:--|:--|
|**strcmp(引数1,引数2)**|引数1が引数2より大きかったら1を返す。引数1が引数2より小さかったら-1を返す。|
|例|```echo strcmp("5member", 3); // 1```|
||```echo strcmp(3, "5member"); // -1```|

##P40
■8.
**次のコードを実行した結果として正しいものを選択してください。**

```php:
$i = 1;
$add = 0;
while (++$i < 10){
	$add += $i;
}

print  $add; // 44
```

答え→C.44


#第4章
##P51
■7.
**配列から文字列を作成する関数として正しいものを選択してください。**
A.unset()
B.implode()
C.explode()
D.in_array()

答え→B

```php:7の例
<?php
$colors[0] = 'red';
$colors[1] = 'yellow';
$colors[3] = 'orange';
$colors[2] = 'blue';
$colors[4] = 'blue';
foreach ($colors as $color){
	echo $color;
}
unset($colors[3]);
echo (implode('★', $colors));
echo in_array('blue', $colors);
var_dump(in_array('purple', $colors));

$fruits = 'apple＆orange＆pear＆banana';
$fruitsCut = explode('＆', $fruits);
foreach ($fruitsCut as $fruit){
	echo $fruit;
}
```

```php:実行結果
redyelloworangebluebluered★yellow★blue★blue1
boolean false

appleorangepearbanana
```

#第5章
##P68
■6.
**関数についての説明として誤っているものを選択して下さい。**
A.関数内でreturn文を複数記述することができる
B.関数が何も値を返さない場合、return文の記述は省略することができる
C.return文は値をカンマで区切ることで複数の値を返すことができる
D.return文は配列を返すことができる

答え→C

■6.解説
return文は通常、1つの値しか返すことができず、
値をカンマで区切って複数の値を返すことはできません。
<font color="red">return文で複数の値を返すには、
1つの配列に複数の値を格納し、その配列を返します。</font>

```php:例
function func(){
	return array('Japanese' => '国語', 'math' => '数学', 'science' => '理科');
}
$var = func();
print $var['math'].$var['science'];
```

```php:例実行結果
数学理科
```
[参考サイト](http://tomo.blue/index.php/developer/php%E3%81%AE%E6%8A%80%E9%9B%86/return/)


##P70
■8.
**次のコードを実行した結果として正しいものを選択してください。**
A.9
B.10
C.19
D.20

答え→A

```php:スコープの問題
function countup($num){
	for ($i = 0;$i < 10; $i++){
		$num += 1; //ローカル変数$num
	}
}

$num = 9;
countup($num); //グローバル変数$num
print $num; //9
```

■8.解説
変数にはスコープ(有効範囲)があるため、関数の内部で変数の値を変更しても、関数の外部にある変数には影響を与えません。
ローカル変数``$num``とグローバル変数``$num``は全く別の変数として扱われる。

##P70
■9.
**関数内からグローバル変数にアクセスするために用いる配列として正しいものを選択してください**
答え→$GLOBALS

#第6章
##P82
■5.
**変数($date)の値が文字列かどうかを判断するための記述として正しいものを選択してください。**
答え→strval($data)

##P83
■7.
**サブミットされたデータが今日より3ヶ月前の日付か判断します。
空欄①に当てはまる記述として正しいものを選択してください。**
答え→strtotime

```php:
$end = ①('3 months ago');
$now = time();

$year = $_POST['year'];
$month = $_POST['month'];
$day = $_POST['day'];
// 英文形式の日付をUnixタイムスタンプに変換する
$date = ①($year . '-'.$month. '-'. $day);

if(($now <= $date) || ($end >= $date)){
	print 'Error : Please input the date correctly.';
}
```

[strtotime()](http://qiita.com/icelandnono/items/1499b3b570885cb502bf)

```php:test34-input.php
<body>
	<form action="test34.php" method="post">
		<p>
			年<input type="text" name="year">

		</p>
		<p>
			月<input type="text" name="month">

		</p>
		<p>
			日<input type="text" name="day">

		</p>
		<input type="submit" value="送信">

	</form>
</body>
```

```php:test34.php
<?php
$end = strtotime('3 months ago');
$now = time();

$year = $_POST['year'];
$month = $_POST['month'];
$day = $_POST['day'];
// 英文形式の日付をUnixタイムスタンプに変換する
$date = strtotime($year . '-'.$month. '-'. $day);

//もし3ヶ月前の日付が送信されたらエラーメッセージ表示される
if(($now <= $date) || ($end >= $date)){
	print 'Error : Please input the date correctly.';
}
```

![201704104.png](https://qiita-image-store.s3.amazonaws.com/0/95187/d3540996-3c7d-9794-4061-9dae79d7f331.png)

#第7章
##P90
■2.
**MDB2モジュールがロードされた後、データベースに接続するための記述として正しいものを選択してください。**

##P97
■11.
**SQLのセキュリティと利便性についての説明で誤っているものを選んで下さい。**

A.SQLインジェクションを防ぐためにSQL文で特別な意味を表す文字列をエスケープ処理する必要があるが、その方法の1つにプレースホルダーの機能がある
B×
C.nextID()関数を利用すると、テーブルに対して新たな一意のシーケンスIDを取得することができる
D.データベースから取り出した行を文字列キーの配列として取得するには、setFetchMode()関数にMDB2_FETCHMODE_ASSOCを指定する
E.SQL文でワイルドカードを利用して部分一致検索をする際には、WHERE句内でLIKE演算子を使用する

答え→B

|　　　　　||
|:--|:--|
|**Magic Quotes**|PHPスクリプトに入力されるデータを自動的にエスケープする機能|
|**プレースホルダー**|文字列の1部を他の文字列に置き換える機能|
|||

#第9章
##P118
■2.
**現在時刻を取得する記述として正しいものを選択してください。**

A. date('c'); 
B. mktime('%c');
C. strftime('c');
D. strtotime('%c');

答え→A　date('c');

```php:
echo date('c'); // 2017-04-19T11:19:42+02:00
echo mktime('%c'); //エラーが起きる
echo strftime('c'); //c
echo strtotime('%c'); //表示されない
```

|　　　　　||
|:--|:--|
|**date()**|日付・時刻を書式化する|
|**strftime()**|ロケールの設定に基づいて日時を書式化する|
|**mktime()**|指定した日時のUNIXタイムスタンプを取得する|
|**date('c');**| ISO 8601 日付 (PHP 5 で追加されました) |

■3.
**2011年2月1日を「02/01/11」と表示するための記述として正しいものを選択してください。**

A. date('c'); 
B. mktime('%c');
C. strftime('c');
D. strtotime('%c');

```php:
print date('m/d/y'); // 04/20/17
echo '</br>';
print strftime('%m/%d/%y'); // 04/20/17
echo '</br>';
print date('M/D/Y'); //Apr/Thu/2017
echo '</br>';
print strftime('%M/%D/%Y');
```

■4. 
**15時10分53秒を「15:10:53」と表示するための記述として正しいものを選択してください。**
答え→A strftime('%H:%M:%S')

■5.
**現在時刻から1時間後の時間を表示するための記述として正しいものを選択してください。**
答え→D print date('h:i:s', time() + 60*60);

#第15章
##P170
■2.
**次の正規表現と一致しないものを選択してください。
Girl|B.y**

A. Gir; 
B. GirBoy;
C. B6y;
D. GrlBy;
E. GirlB9y
F. aaaBoy

答え→AD