dポイントプレゼントキャンペーン実施中!

以下のようなPHPを作成しました。
が、同じようなコードが繰り返し使われていて、
なんとか簡略化できないかなと考えています。

例えば、↓が10回出てくる。
LEFT(番号,LEN(番号)-2) + '-' + RIGHT (RTRIM(番号), 2) AS 番号2

なにかやり方あるのでしょうか。
見当違いのとこを言っていたらすいません。

******************************************************
作成したPHP
環境:PHP5.2 Apache2.2 SQLserver5
******************************************************
<a href="clip.php?x=a">あ</a><br>
<a href="clip.php?x=ka">か</a><br>
<a href="clip.php?x=sa">さ</a><br>

<a href="clip.php?x=wa">わ</a><br>


<?PHP
$cont = mssql_connect("サーバ名","ユーザ名","パスワード");
mssql_select_db('[DB名]', $cont);

if ($_GET['x']=='a') { // あ行
$sql = "select 氏名, 住所, LEFT(番号,LEN(番号)-2) + '-' + RIGHT (RTRIM(番号), 2) AS 番号2 from テーブル名 WHERE (氏名 LIKE N'あ%' OR 氏名 LIKE N'い%' OR 氏名 LIKE N'う%' OR 氏名 LIKE N'え%' OR 氏名 LIKE N'お%') ORDER BY 氏名";
}

if ($_GET['x']=='ka') { // か行
$sql = "select 氏名, 住所, LEFT(番号,LEN(番号)-2) + '-' + RIGHT (RTRIM(番号), 2) AS 番号2 from テーブル名 WHERE (氏名 LIKE N'か%' OR 氏名 LIKE N'き%' OR 氏名 LIKE N'く%' OR 氏名 LIKE N'け%' OR 氏名 LIKE N'こ%') ORDER BY 氏名";
}

if ($_GET['x']=='sa') { // さ行
$sql = "select 氏名, 住所, LEFT(番号,LEN(番号)-2) + '-' + RIGHT (RTRIM(番号), 2) AS 番号2 from テーブル名 WHERE (氏名 LIKE N'さ%' OR 氏名 LIKE N'し%' OR 氏名 LIKE N'す%' OR 氏名 LIKE N'せ%' OR 氏名 LIKE N'そ%') ORDER BY 氏名";
}

……………た行~ら行も同様のコードなので省略…………………


if ($_GET['x']=='wa') { // わ行
$sql = "select 氏名, 住所, LEFT(番号,LEN(番号)-2) + '-' + RIGHT (RTRIM(番号), 2) AS 番号2 from テーブル名 WHERE (氏名 LIKE N'わ%' OR 氏名 LIKE N'を%') ORDER BY 氏名";
}

$rc = mssql_query($sql,$cont);

print("</table>");

while ($array = mssql_fetch_array($rc)) {
print("<tr><td>");
print "".$array["氏名"]."";
print("</td><td>");
print "".$array["住所"]."";
print("</td><td>");
print "".$array["番号2"]."";
print("</td></tr>");
}

print("</table>");
mssql_close($cont);
?>

A 回答 (3件)

配列を使う例です。



<?PHP
$whereArray=Array(
"a"=>Array("あ","い","う","え","お"),
"ka"=>Array("か","き","く","け","こ"),
"sa"=>Array("さ","し","す","せ","そ")
);

$_GET['x']="a"; //テスト

$whereStr="";
if(is_array($whereArray[$_GET['x']])){
foreach($whereArray[$_GET['x']] as $val){
$whereStr.=($whereStr==""?"":" OR ")."氏名 LIKE N'{$val}%'";
}
$whereStr="AND ( {$whereStr} )";
}
$sql = <<<eof
select 氏名, 住所, LEFT(番号,LEN(番号)-2) + '-' + RIGHT (RTRIM(番号), 2) AS 番号2
from テーブル名
WHERE 1
{$whereStr}
ORDER BY 氏名
eof;
print $sql;
?>

ちなみにか行の「がぎぐげご」など濁音半濁音関係は大丈夫ですか?
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
半濁音忘れていました。ご指摘ありがとうございます。
早速修正しましたが、エラーメッセージが出ました。

*******エラーメッセージ**************
Parse error: syntax error, unexpected T_VARIABLE in C:\Program Files\Apache…test.php on line 70
*************************************

クエリを実行できないようなメッセージかと思います。
いただいたコードがよくわからなかったので、
よかったらご教授ください。

*************************************

$whereArray=Array(
"a"=>Array("あ","い","う","え","お"),
"ka"=>Array("か","き","く","け","こ"),
"sa"=>Array("さ","し","す","せ","そ")
);

↑こちらはArrayを二回使っているということでしょうか。
通常であれば、"a"=> "あ"のように使うのかと思いますが、
こちらの場合は、"a"が"あ"から"お"まで置き換える?ということでしょうか。


$_GET['x']="a"; //テスト

$whereStr="";
if(is_array($whereArray[$_GET['x']])){
foreach($whereArray[$_GET['x']] as $val){
$whereStr.=($whereStr==""?"":" OR ")."氏名 LIKE N'{$val}%'";
}
$whereStr="AND ( {$whereStr} )";
}

↑こちらは、(1)IF文の中に(2)foreach文を入れているのでしょうか。

お礼日時:2007/08/22 18:22

test.php の70行目(もしくは69行目)に何がかいていあるのかが


書いてありませんので状況がわかりかねます。
とにかくサンプルスクリプトをそのまま実行していただき、
動作したら、ホンチャンスクリプトに組み込むという2段階のテストを
してください。

>こちらはArrayを二回使っているということでしょうか。
Arrayの中にArrayを入れることができます。
データ管理上常套的なものですので覚えておくと役にたつとおもいます。

>こちらは、(1)IF文の中に(2)foreach文を入れているのでしょうか。
IFをいれてる理由はforeachでまわす変数が配列でないときは
エラーになるからです。
foreachの中でやっているのは三項演算ってやつですね。
ifでもかけるのでなれないうちは自分のわかる書式をご使用ください
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
foreachがよくわからないので、
ifでやってみます。
ありがとうございました。

お礼日時:2007/08/30 18:05

配列に入れて繰り返しを書くとだいぶ違います。



$hoge = array(
"氏名 LIKE N'あ%' OR 氏名 LIKE N'い%' OR 氏名 LIKE N'う%' OR 氏名 LIKE N'え%' OR 氏名 LIKE N'お%'",
"氏名 LIKE N'か%' OR 氏名 LIKE N'き%' OR 氏名 LIKE N'く%' OR 氏名 LIKE N'け%' OR 氏名 LIKE N'こ%'",
...
);

これでも1行で5回(あ~お)ずつ繰り返されていますからもっと簡略化できるでしょう。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
配列(array)というのがあるのですね。
はじめてしりました。
ありがとうございました。

お礼日時:2007/08/22 18:13

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!