プロが教えるわが家の防犯対策術!

やりたいこと:
phpを実行して取得したデータの内容と既にDBのテーブルに格納されているデータを
比較して、
異なっていれば、新しいデータとして INSERT INTO文で
テーブルにデータを登録する。
同じであれば、登録しない。
という処理がしたいです。

$sql = "select * from hoge where url= $page_uri";
$kakunin = mysql_query($sql , $db );

if ( $page_uri == $kakunin ){
//同じデータならスキップ
break;
}
else{
$sql = mysql_query("INSERT INTO hoge VALUES (0,'$page_uri','$pon')");

と書いているのですが、以下のエラーが出てしまいます。。

Fatal error: Cannot break/continue 1 level in /www/xx.php on line 42

これは、breakは使えないよ ってことでしょうか?

breakでなくても やりたいことが実現できればこだわりはないのですが、、
アドバイスよろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (3件)

> Fatal error: Cannot break/continue 1 level in /www/xx.php on line 42



breakは書かなくていいですよ
まずはbreakを消すことから
    • good
    • 0
この回答へのお礼

breakいらなかったんですね、、ご指摘ありがとうございます。

お礼日時:2012/04/26 11:46

>これは、breakは使えないよ ってことでしょうか?



RTFM.
http://www.php.net/manual/ja/control-structures. …

breakしてどこに行くのか(制御が移るのか)・・・。whileやforなどであればLoopを抜けますが、そうでなければbreakは書きません(行き先がありません)。breakの代わりにcontinueなら「おかしい」ことはわかりますよね?


>$sql = "select * from hoge where url= $page_uri";
>$kakunin = mysql_query($sql , $db );
>
>if ( $page_uri == $kakunin ){

mysql_queryだけで結果セットを取得するということにはなっていません。mysql_queryの戻り値はresourceです。当然そのresourceからmysql_fecth_arrayなどでレコードを取得しないといけません。

RTFM.
http://php.net/manual/ja/function.mysql-query.php
http://php.net/manual/ja/function.mysql-fetch-ar …

なおSQL文にwhereで条件付けしているのですから、一致かどうかを確認する意味はないです。該当するレコードがあるかどうかだけで判断してかまいません。

$sql = sprintf("select * from hoge where url='%s'",
mysql_real_escape_string($page_uri));
$res = mysql_query($sql);
if (mysql_num_rows($res) = 0) {
$sql = sprintf("INSERT INTO hoge VALUES (0,'%s','%s')" ,
mysql_real_escape_string($page_uri),
mysql_real_escape_string($pon'));
mysql_query($sql) or die('db error');
}
    • good
    • 0
この回答へのお礼

ご指摘ありがとうございます。記述いただいた内容で試してみます!!

お礼日時:2012/04/26 11:47

書き方に一貫性がないですね


URIの項目にunique属性がついているなら、IGNOREでINSERTすれば
データがあれば無視、なければ投入になります

$sql = "INSERT IGNORE INTO hoge VALUES (0,'$page_uri','$pon')");
$res= mysql_query($sql);

必要に応じてmysql_real_escape_string()などでエスケープしてください
    • good
    • 0
この回答へのお礼

アドバイスありがとうございます。
URIの項目にunique属性をつけたいのですが、バイト数が1000を超えており
エラーとなってしまうため、unique属性が付けられない状態です・・
*Specified key was too long; max key length is 1000 bytes

お礼日時:2012/04/25 00:51

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QPHP + MySQL で登録時に重複チェックをしたいです。

PHP + MySQL で登録時に重複チェックをしたいです。
DBには
ID Title Name
1 Book1 Author1
2 Book2 Author2
と3000件ほど入っています。これからも増えていく予定です。

このDBにPHPから新たに100件ほどのレコードを一気に登録したいときに、
・Title名が既にDBに登録されている → 何もせずに次へ
・Title名がまだ登録されていない時 → DBへ登録
と、この様な処理をさせたいと考えています。

現状は登録したい値を配列で回し、一つ一つSELECT文で件数チェックをし、0件で有れば登録。0件以外であれば無視。と、している状況です。
ただこれですと、どうしてもサーバーに負担が掛かってしまう気がするのです。

もし、何か他に良い方法がありましたら教えていただけないでしょうか?
よろしくお願いいたします。

Aベストアンサー

他の方法の例として、

DBにて、"Title" をunique keyにして、登録時に、
INSERT IGNORE INTO table_name 構文を使ってINSERT する

では如何でしょう。
Mysqlが、勝手に重複しいれば無視して、重複がなければ登録してくれます

Q重複チェックを行わず、INSERT時にエラーではじけないか?

最近オラクルを学んでいるものです。勉強をしていて思った素朴な疑問があ
るのでみなさん教えて下さい。

INSERTにて一意の部分が重複するとエラーで落ちてしまうと思うのですが、
だからと言ってINSERT手前で重複チェック、つまり一度DBを読んでから、
INNSERTすると返って二度手間ですし、これが業務アプリの場合レスポン
スが悪くなりますよね?

何かこれを回避できる良い手段はあるのでしょうか?
初歩的な事かもしれませんがよろしくお願いします。

Aベストアンサー

昔やった方法ですが、エラーコードを判定することによって回避可能です

・いきなりInsertする(正常終了はもちろん問題なし)
・エラー時 それは一意制約のエラーコード?を判定
一意制約エラーなら → 次の処理へ? ・・・
それ以外のエラーなら → 落とす? ・・・ など

ちなみにselectでチェックしてからinsertの場合でも
そのわずかの間に他からinsertされていて、エラーになることもあります
(同時にinsertしにいくことがなければ問題ありませんが)

Qsyntax error, unexpected '}' というエラーの対処法

PHPを習い始めて三日目になるのですがParse error: syntax error, unexpected '}' in C:\Program Files\Apache Group\Apache2\htdocs\****\****\game.php on line 33
というエラーがでるのですが33行目前後のどこをなおせばいいのでしょうか?
・game.php
<html>
<head>
<title>数当てゲーム</title>
</head>
<body>
<h1 style="background:#cccccc">数当てゲーム</h1>
<form method="POST" action="game.php">
1~100までの数を入力してください
<input type="text" name="answer" size="5" maxlength="3" />
<input type="sbumit" value=回答" />
</form>
<hr />
<?php
session_start();
if(is_null($_SESSION['answer'])){
mt_stand(microtime()*1000000);
$_SESSION['answer']=mt_rand(1,100);
$_SESSION['game_cnt']=0;
}
if($_POST['answer']!=""){
$_SESSION['game_cnt']++;
if($_session['answer']==$_POST['answer']){
print("おめでとうございます".
$_SESSION['game_cnt']."回で正解しました!");
session_destroy();
}else{
if($_SESSION['answer']>$_POST['answer']){
print("もう少し大きいです。");
}else
print("もう少し小さいです。");
}
}
}
?>
</body>
</html>
それとこの間違えたところをなおしたあとはいつもコンピュータを再起動しないと修正したところが適用されないのですがほかに方法はないですか?基本的な質問ですいません。

PHPを習い始めて三日目になるのですがParse error: syntax error, unexpected '}' in C:\Program Files\Apache Group\Apache2\htdocs\****\****\game.php on line 33
というエラーがでるのですが33行目前後のどこをなおせばいいのでしょうか?
・game.php
<html>
<head>
<title>数当てゲーム</title>
</head>
<body>
<h1 style="background:#cccccc">数当てゲーム</h1>
<form method="POST" action="game.php">
1~100までの数を入力してください
<input type="text" name="answer" size="5" max...続きを読む

Aベストアンサー

print("もう少し大きいです。");
}else
print("もう少し小さいです。");
のelseの後に{がないようですが、大丈夫でしょうか?

Qテーブルの最後(最新)のレコードを抽出したい

宜しくお願いします。
PHP MYSQL の組み合わせで使っています

以下のようにして、最後のレコードを取り出したいのですが
まったく違う事をしているのかもしれません。

$sql =" select * from テーブル where フィールド='max' " ;

フィールドはauto_incrementで番号を振っています。
これで最大のつもりなのですが・・・。

他にも、レコードを入れた時間も記録したフィールドがあるのですが
どうしてよいか?判りません。

テーブルの最新のレコードを出したいのです。
**その中の一つのフィールドを取り出すのですが、
  それはうまくいっているみたいです 
  (max の所に数字を入れると表示します)

お手数かけますが、どなたかご教授お願いいたします。

Aベストアンサー

#2回答者です。

MySQL 4.1以前(サブクエリを使えない)なら、以下のような方法が考えられます。

select * from 表名
order by 列名 desc limit 1

QFORMで送信ボタンと戻るボタンを2つつけてそれぞれ遷移先を変えたい

  
以下のような画面を作りたいのですが↓

--------------------------------------------------------------------------------
● a.php (ユーザ情報入力画面) ※フォームに入力する画面
 
 <FORM method="POST" action="b.php">
  <INPUT type="text" name="mail">
  <INPUT type="submit" name="submit" value="確認">
 </FORM>

● b.php (ユーザ情報入力確認画面)※フォームに入力された値を表示する画面

 <FORM method="POST" action="c.php">
  <!-- ここには、フォームに入力された値を表示する -->
  <INPUT type="submit" name="submit" value="登録"> // c.php に遷移する
  <INPUT type="submit" name="submit" value="戻る"> // a.php に戻る
 </FORM>

● c.php (完了画面)
--------------------------------------------------------------------------------
b.php について質問なのですが、
b.phpにおいて、登録ボタンと戻るボタンを2つつけて、
それぞれ遷移先を変えたいのですが、どうすればいいんでしょうか・・・?
<FORM method="POST" action="c.php">と書いてしまうと、
戻るボタンを押しても戻らずに、c.phpに遷移してしまいますよね??
こういう場合ってJavaScriptとかで遷移先を指定するんですか・・?
もしそうでしたら、JavaScriptがよくわからないので
できればサンプルコード示していただけると助かります・・・。
  

  
以下のような画面を作りたいのですが↓

--------------------------------------------------------------------------------
● a.php (ユーザ情報入力画面) ※フォームに入力する画面
 
 <FORM method="POST" action="b.php">
  <INPUT type="text" name="mail">
  <INPUT type="submit" name="submit" value="確認">
 </FORM>

● b.php (ユーザ情報入力確認画面)※フォームに入力された値を表示する画面

 <FORM method="POST" action="c.php">
  <!-- ここには、フォームに入...続きを読む

Aベストアンサー

はじめまして。

<INPUT type="submit" name="submit" value="登録" onClick="form.action='c.php';return true">
<INPUT type="submit" name="submit" value="戻る" onClick="form.action='a.php';return true">

でいいと思います。(実際、このコードで使っています)
値を渡すには、FORM内にhiddenで、値を設定しておいて、methodをPOSTに設定しておけば、渡せます。

QMAX値を条件にデータを取得するには?

SQL文で困っています。
ご教授下さい。


下記のようなデータがあった場合、それぞれの区分毎に
年月が最大(最新)のデータを取得したいです。
(実際には1レコードにその他項目があり、それらも取得します。)
<検索対象データ>
区分 年月   金額
-----------------------------
A   200412  600
A   200503  560
B   200311  600
B   200508  1000
B   200504  560
C   200508  400
C   200301  1100


<取得したいデータ>

区分 年月   金額
-----------------------------
A   200503  560
B   200508  1000
C   200508  400

よろしくお願いします。

Aベストアンサー

テーブル名をXXXとすると次のようなSQLでよいと思います。(最善の方法かどうかは自信がないですが)

select B.* from (select 区分, max(年月) as 年月 from XXX group by 区分) As A
inner join XXX as B on A.区分 = B.区分 and A.年月 = B.年月
order by B.区分

Qphpからinsertできない

またお世話になります。
PHPからMySQLへデータをインサートしたいのですが、各サイトを参考にしながら試しているのですがどうにも上手くいきません。
ソースを見ていただけますでしょうか?

$con = mysql_connect("localhost","user","password")
or die("MySQLに接続できません。");

mysql_select_db('test');
$sql = "SET CHARACTER SET UTF8";
$result = mysql_query($sql);

$data1 = $HTTP_POST_VARS["inpdata1"];
$data2 = $HTTP_POST_VARS["inpdata2"];
$data3 = $HTTP_POST_VARS["inpdata3"];

$sql = 'INSERT INTO `tab1` (`abc`, `def`, `ghi`) VALUES (`$data1`,`$data2`,`$data3`);';
$result = mysql_query($sql);

print $data1; //ここでは通常にデータが表示されるので
print $data2; //データの受け渡しは問題ないはずですが。
print $data3;

mysql_free_result($result);
mysql_close($con);

またお世話になります。
PHPからMySQLへデータをインサートしたいのですが、各サイトを参考にしながら試しているのですがどうにも上手くいきません。
ソースを見ていただけますでしょうか?

$con = mysql_connect("localhost","user","password")
or die("MySQLに接続できません。");

mysql_select_db('test');
$sql = "SET CHARACTER SET UTF8";
$result = mysql_query($sql);

$data1 = $HTTP_POST_VARS["inpdata1"];
$data2 = $HTTP_POST_VARS["inpdata2"];
$data3 = $HTTP_POST_VARS["inpdata3...続きを読む

Aベストアンサー

$result = mysql_query($sql) or die(mysql_error());

としてデバッグしてみるといいですよ。

×$sql = 'INSERT INTO `tab1` (`abc`, `def`, `ghi`) VALUES (`$data1`,`$data2`,`$data3`);';
○$sql = "INSERT INTO `tab1` (`abc`, `def`, `ghi`) VALUES ('$data1','$data2','$data3')";

単純に、valuesの中で渡すデータはバッククォーテーションではなく
シングルクォーテーションです。フィールド名ではなくデータを
わたしたいのですから・・・。
$sql変数に代入する場合のくくりはダブルクォーテーションですね。
(変数を参照するため)

それと念のため、sqlのケツのセミコロンは取っておいた方がよいです。

Qphpでmysqlを使ってデータベース内の最大値の取得

PHPでMYSQL内テーブル(hogehoge)の「no」フィールドの最大値を取得をしたいのですが、ほしい結果が得られません。
【PHP】
--------------------------------------------------------------
$my_Max = "select max(no) from hogehoge";
$kekka_max = mysql_query($my_Max);
--------------------------------------------------------------
no→今回最大値を取得したい項目(int)

【結果】
これをechoで出力すると、
-----------------------------
Resource id #4
-----------------------------
となってしまいます。
「no」の中の最大値を取得したいのですが、どうしたらよいでしょうか?

【環境】
WindowsXP
mysql:5.0.51
php:5.2.5

PHPでMYSQL内テーブル(hogehoge)の「no」フィールドの最大値を取得をしたいのですが、ほしい結果が得られません。
【PHP】
--------------------------------------------------------------
$my_Max = "select max(no) from hogehoge";
$kekka_max = mysql_query($my_Max);
--------------------------------------------------------------
no→今回最大値を取得したい項目(int)

【結果】
これをechoで出力すると、
-----------------------------
Resource id #4
----------------------------...続きを読む

Aベストアンサー

count()でなくmax()か。

$sql = "select max(column) as mx from hogehoge";
$res = mysql_query($sql);
$row = mysql_fetch_assoc($res);
echo $row['mx'];

// アクセスできない、とは書いたものの
// $row['max(column)']とすることで取得できた気もする。
// 気持ち悪いから普通やらないと思うけど。

QDBエラーの意味

フォームからDBにデータ挿入しようとすると

Column count doesn't match value count at row 1

というエラーが出てしまいます・・・どういう意味を持ったエラーなんでしょうか?

Aベストアンサー

カラム数と値の数が合わない、と言う事です。簡単な英語なので覚えましょう。
カラム数が4つにもかかわらず、
"INSERT INTO tablename VALUES (1,'hoge',3)"
とやった場合等に出るエラーだと思います。

Qフォームへの前回入力値をクリアーする方法は?

以下のコードでフォームへの前回入力値を保持しています。
送信前は"RESET"ボタンで入力値をクリアーできますが、送信後は入力値をクリアーできません。(RESETボタンをクリックしても送信済$_POSTが表示されます)おそらくブラウザのキャッシュで$_POSTの値が保持されているためと思われますが、何らかのボタンクリックでこれらの$_POST値をクリアする方法をご存知に方、是非ご教授ください。

<?php
$yyyy=$_POST[Y];
$mm=$_POST[M];
$dd=$_POST[D];
?>

<FORM action="<?=$_SERVER[PHP_SELF]; ?>" method="post" >
<P>YYYY<INPUT size="10" type="text" name="Y" value="<?= $yyyy;?>"></P>
<P>MM<INPUT size="10" type="text" name="M" value="<?= $mm;?>"></P>
<P>DD<INPUT size="10" type="text" name="D" value="<?= $dd;?>"></P>
<INPUT type="submit" name="submit" value="送信">
<INPUT type="reset" name="reset" value="reset">
</FORM>

以下のコードでフォームへの前回入力値を保持しています。
送信前は"RESET"ボタンで入力値をクリアーできますが、送信後は入力値をクリアーできません。(RESETボタンをクリックしても送信済$_POSTが表示されます)おそらくブラウザのキャッシュで$_POSTの値が保持されているためと思われますが、何らかのボタンクリックでこれらの$_POST値をクリアする方法をご存知に方、是非ご教授ください。

<?php
$yyyy=$_POST[Y];
$mm=$_POST[M];
$dd=$_POST[D];
?>

<FORM action="<?=$_SERVER[PHP_SELF]; ?>" metho...続きを読む

Aベストアンサー

「リセットをサブミットする」って言ったら変なのかな?

<?php
$post = $_POST;

if ( 'reset' != $post[ 'reset' ] )
{
$year = $post[ 'year' ];
$month = $post[ 'month' ];
$day = $post[ 'day' ];
}
else
{
unset ( $post );
}

if ( isset ( $post ) )
{
$reset = 'submit';
}
else
{
$reset = 'reset';
}
?>
<form action="<?php echo ( $_SERVER[ 'PHP_SELF' ] ); ?>" method="post">
<p>
Y:<input size="10" type="text" name="year" value="<?php echo ( $year ); ?>" /><br />
M:<input size="10" type="text" name="month" value="<?php echo ( $month ); ?>" /><br />
D:<input size="10" type="text" name="day" value="<?php echo ( $day ); ?>"><br />

<input type="submit" name="submit" value="submit" />
<input type="<?php echo ( $reset ); ?>" name="reset" value="reset" />
</p>
</form>

「リセットをサブミットする」って言ったら変なのかな?

<?php
$post = $_POST;

if ( 'reset' != $post[ 'reset' ] )
{
$year = $post[ 'year' ];
$month = $post[ 'month' ];
$day = $post[ 'day' ];
}
else
{
unset ( $post );
}

if ( isset ( $post ) )
{
$reset = 'submit';
}
else
{
$reset = 'reset';
}
?>
<form action="<?php echo ( $_SERVER[ 'PHP_SELF' ] ); ?>" method="post">
<p>
Y:<input size="10" type="text" name="year" value="<?php echo ( $year ); ?>" /><b...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング