【無料配信♪】Renta !全タテコミ作品第1話

プログラム初心者です

mysqlでトランザクションを使いたいです

いままでMyISAMを使ってきました。これをInnoDBにするだけで同時アクセスが可能になるのでしょうか?

sqlのupdateもトランザクションは効くのでしょうか?

pdoのほうでなにかやることはありますか?こんな感じのupdateを実行したいです

$pdo->prepare('UPDATE point_table SET point = point+1 WHERE id = ?');
$stmt->bindValue(1, 15, PDO::PARAM_INT);
$stmt->execute();

よろしくお願いします

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

A 回答 (3件)

画像小さくなっちゃったのでこっちで↓


http://qiita.com/mpyw/items/b00b72c5c95aac573b71 …
    • good
    • 0
この回答へのお礼

見やすかったです
簡単な加算だとなしでもいいのですね。勉強になりました。ありがとうございます

お礼日時:2014/03/26 21:00

素晴らしい記事を見つけました。



MySQLのトランザクション分離レベル
http://tree-tips.appspot.com/mysql/transaction_i …

ロストアップデートの有無を見るためのスクリプトを2つ用意します。point_tableにあらかじめレコードを1つだけ入れておいてください。Aを実行後10秒以内にBを実行し、2つのスクリプトがどちらも実行完了したあとの結果がどうなるかを、「//」のコメントアウトがある場合と無い場合で比較してみてください。

[スクリプトA]
// $pdo->exec('SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE');
$pdo->beginTransaction();
$point = $pdo->query('SELECT point FROM point_table')->fetchColumn();
sleep(10);
$pdo->exec('UPDATE point_table SET point = ' . ++$point);
$pdo->commit();

[スクリプトB]
// $pdo->exec('SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE');
$pdo->beginTransaction();
$pdo->exec('UPDATE point_table SET point = point + 100');
$pdo->commit();

RepeatableReadの方では「+1」、Serializableの方では「+101」される結果になると思います。ただしこのようにSerializableレベルでトランザクション分離が必要になるケースは非常に稀です。「同時アクセス」という言葉でくるめてしまわずに、自分が必要としている最低限度のレベルを探してみてください。むしろ単純に加減算する程度ならばトランザクション処理の必要性すら無くなったりします。
「同時アクセスについて」の回答画像2
    • good
    • 0
この回答へのお礼

回答ありがとうございます
トランザクションもいろいろレベルがあるのですね
自分が考えていたよりも奥が深かったのです(汗

お礼日時:2014/03/26 20:58

毎度毎度になりますがまとめ貼りますね(笑)



Qiita - PHPでデータベースに接続するときのまとめ #トランザクション処理
http://qiita.com/mpyw/items/b00b72c5c95aac573b71 …

InnoDBは4レベルのトランザクション分離をサポートしており、一番安全なようにアクセスごとに完全分離させたいならば

$pdo->exec('SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE')

を実行してください。
    • good
    • 0
この回答へのお礼

回答ありがとうございます
なんとか出来た?と思うのですが、見た目が変わらないのでなんともいえません
トランザクションが成功しているか確認する方法はありますか?

お礼日時:2014/03/26 03:11

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

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

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

QPHPの関数実行

<?php
function disp(){
echo "hello world";
}
?>

<form>
<input type="text">
<input type="button" onclick="<?php disp() ?>">
</form>

といったソースを書いてみたのですが、ボタンを押してみるのですが作動しません。
どこか間違えているのでしょうか、それとも作動しないのでしょうか・・・。
当方としては、formのinputボタンを押したらPHPの関数が実行させるようにしたいのですが・・・。
どなたかご助言をお願いします。

Aベストアンサー

ウソつきました
出来ましたー

<?php

if($_REQUEST[submit] == TRUE){
function disp(){
echo "hello world";
}
}

else{
function disp(){
echo "";
}
}

?>

<form method="post" action="">
<input type="text" value="<?php disp(); ?>">
<input name="submit" type="submit"value="押せ">
</form>

QERROR1062:Duplicate entry.....というエラーが出てしまいました

いつもお世話になります。
データベースからSELECTで抽出したデータを別のテーブルにINSERTするSQLを実行したのですが、
ERROR1062:Duplicate entry.....というエラーが出てしまいました。
お詳しい方がいらっしゃいましたら、アドバイスをいただけませんでしょうか?よろしくお願いいたします。
【実行したSQL】
INSERT INTO tblA (dataA1, dataA2, dataA3, dataA4) SELECT "9001","AA",dataB1,dataB2 FROM tblB WHERE dataB1 = 52

tblAの主キー:dataA1とdataA2
tblBの主キー:dataB1

dataA1とdataA2はtblAの主キーとなっているため、重複してしまうということのようです。tblBの主キーはdataB1であるため、抽出されてくるデータは常に1件なので問題ないと期待していましたが、甘くなかったようです。何か良い方法はないものでしょうか?よろしくお願いいたします。

Aベストアンサー

「ERROR 1062」は、重複データを格納しようとした場合に出力されるエラーです。
既にdataA1='9001'&dataA2='AA'という行が、tblAに格納されているのですよね?

>抽出されてくるデータは常に1件なので問題ないと期待していました

「insert ~ select ~」を実行前に、既に同じデータが格納されているのでは?
あるいはprimary keyの指定が、質問中に記された通りでなく、2件以上検索されているかです。

>何か良い方法はないものでしょうか?

何をするための方法を、聞きたいのかが分かりませんが?

QボタンをクリックでPHP文を実行

ボタンをクリックしたときのみPHP文を実行したいのですが・・・

<input type="button" onClink="<?php~?>">
でいけるかと思ったのですが、
ページ表示時に<?php~?>が実行されてしまい、うまくいきませんでした。

onClink="window.open(test.php)"
という方法以外でお願いします。

Aベストアンサー

AjaxはもともとJavaScriptの機能である非同期通信をつかったもので。Ajaxという言語があるわけではありません

Ajaxを利用するのであれば、JavaScriptのXMLHttpRequestを使って非同期通信できるような実装をしなくてはなりません
簡単にサンプルコードで書けるほど単純なものでもありません

一般的なサーバーサイドスクリプトの動作として、
ボタンを押す->サーバーへリクエストする->サーバーが処理する->クライアントに何かしらの結果を返す(出力する)です
つまり、PHP等のサーバーサイドスクリプトは、遷移させることが大前提で動作します

ですから、ボタンを押してその場でJavaScriptと同じようにPHPが動くなんてことはありえません。
ボタンを押したらサーバーにリクエストする という動作ならば可能です。

つまり
質問で言われているような
onClink="window.open(test.php)"

<form name="f1" action="test.php" method="post">
<input type="submit" name="submit" value="submit" />
</form>
等のような形になります

こういった一般的な方法だと いちいち画面が切り替わったようになってしまうのを嫌って Ajaxでコレと同じことを、画面を切り替えずに行っているだけに過ぎません

AjaxはもともとJavaScriptの機能である非同期通信をつかったもので。Ajaxという言語があるわけではありません

Ajaxを利用するのであれば、JavaScriptのXMLHttpRequestを使って非同期通信できるような実装をしなくてはなりません
簡単にサンプルコードで書けるほど単純なものでもありません

一般的なサーバーサイドスクリプトの動作として、
ボタンを押す->サーバーへリクエストする->サーバーが処理する->クライアントに何かしらの結果を返す(出力する)です
つまり、PHP等のサーバーサイドスクリプトは、...続きを読む

Qで配列(複数の要素)を渡したいとき?

こんにちわ,

今HTML+PHPで
$hoge[]にいくつかの要素が入っているとき,
それをあるfoo.phpというページに渡したいとき,
echo '<form action="foo.php" method="POST">';
echo '<input type="hidden" name="$hoge[]" >';
echo '</form>';
としたのですが,うまくいきません。

どうしたらよろしいでしょうか。

Aベストアンサー

nameじゃなく、valueでは?
あとやるなら、
for($i=0;$i<count($hoge);$i++){
print "<input type=\"hidden\" name=\"$hoge[$i][0]\" value=\"$hoge[$i][1]\">";
}
とか?

Q1つのformで複数のactionを実行できますか?

フォーム内に商品の購入ボタンがあります。同じフォーム内に商品名でグーグルのサイト内を検索させるボタンを設置し、横に並べることは可能ですか?
フォームの入れ子はよくないようなので、検索をJava scriptでできればよいのですが・・・
スタイルシートではデザイン上無理でした。

<form id="fm" name="fm" action="URL" method="POST">
<input type="hidden" name="shouhinmei" value="商品名">
<input type="hidden" name="kakaku" value="500">
<input type="image" src="kounyuu.gif value="購入">

<form method=get action="http://www.google.co.jp/search">
<input type=hidden class="q" name=q value="商品名"><input type=hidden name=ie value=UTF-8><input type=hidden name=oe value=UTF-8><input type=hidden name=hl value="ja"><input name=btnG type="image" src="検索.gif value="検索"><input type=hidden name=sitesearch value="サイトのURL"></form>
</form>
</form>

+----+  +----+
|購入|  |検索|
+----+  +----+

フォーム内に商品の購入ボタンがあります。同じフォーム内に商品名でグーグルのサイト内を検索させるボタンを設置し、横に並べることは可能ですか?
フォームの入れ子はよくないようなので、検索をJava scriptでできればよいのですが・・・
スタイルシートではデザイン上無理でした。

<form id="fm" name="fm" action="URL" method="POST">
<input type="hidden" name="shouhinmei" value="商品名">
<input type="hidden" name="kakaku" value="500">
<input type="image" src="kounyuu.gif value="購入">...続きを読む

Aベストアンサー

では、以下のような感じで。
なるべく多くのブラウザで動くように書いたつもりですが検証は充分行ってください。

<html>
<head>
<title></title>
<script type="text/javascript">
<!--
function searchGoogle(q) {
document.forms['searchForm'].elements['q'].value=q;
document.forms['searchForm'].submit();
return false;
}
//-->
</script>

</head>
<body>

<form action="URL">
~~
<input type="image" src="kounyuu.gif value="購入">
<a href="http://www.google.co.jp/" onclick="return searchGoogle('商品名')"><img src="検索.gif" border=0></a>
</form>

<form action="http://www.google.co.jp/search" id="searchForm" style="display:none;">
<input type=hidden name="q">
<input type=hidden name=ie value="UTF-8">
<input type=hidden name=oe value="UTF-8">
<input type=hidden name=hl value="ja">
<input type=hidden name=sitesearch value="サイトのURL">
</form>

</body>
</html>

では、以下のような感じで。
なるべく多くのブラウザで動くように書いたつもりですが検証は充分行ってください。

<html>
<head>
<title></title>
<script type="text/javascript">
<!--
function searchGoogle(q) {
document.forms['searchForm'].elements['q'].value=q;
document.forms['searchForm'].submit();
return false;
}
//-->
</script>

</head>
<body>

<form action="URL">
~~
<input type="image" src="kounyuu.gif value="購入">
<a href="http://www.google.co.jp/" onc...続きを読む

QonClickに複数の関数を挿入する方法

初心者なのですがアニメーションの関数anime1、anime2、anime3を作成し、onClickに下記のように設定しました。
クリックするとアニメーション2つの設定ではは動くのですが、3つ目を設定すると動かなくなります。
通常はこのような設定はしないものなのでしょうか?
教えてください。
よろしくお願いします。
<INPUT type="button" value="START" onClick="anime1(), anime2()">・・・OKです。
<INPUT type="button" value="START" onClick="anime1(), anime2(),anime3()">・・・動きません。

Aベストアンサー

セミコロンでつなぐのが常道ですが、3つ以上なら
別途function化したほうが、可読性が高くなると
思います。

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文字列から、特定の文字を削除したい

アンケートで入力された値を受け取り、メールで送信しているのですが、受け取った値から、特定の文字列を削除することは可能でしょうか?

例えば電話番号の入力の場合、
03-xxxx-xxxx →03xxxxxxxx
077-xxx-xxxx →077xxxxxxx
のように、-(ハイフン)が入力されていたら、-を削除した文字列に置換してメール送信したいのです。
入力する時に、3つのテキストエリアに分けるのは諸事情でできないので、特定の文字を削除する関数か処理方法がありましたら、教えていただきたいです。
よろしくお願いします。

Aベストアンサー

str_replace
http://itbtech.itboost.co.jp/man/php_man/function.str-replace.html

<?php
$orig_telno = "03-xxxx-xxxx";

$telno = str_replace("-", "", $orig_telno);
echo $telno;

03xxxxxxxx

“PHP 文字列” あたりをキーワードに検索すれば
そんなに難しいものでもないような。

QPHPからHTMLへの変数の受け渡し

form.html→page1.php→page2.php
というようなページをつくり、form.htmlでテキストエリア等<form>を使いpage1.phpにデータ:nameを送るとします。
その際$name = $_POST['name'];とするとphpでの変数になってしまってpage1のhtml上では認識されませんよね?
page1からpage2に移動するときにform.phpでいれたnameのデータも
<input type="hidden" name="名前" value="name">
というように使いたいのですがその際page1内でphpでの$nameをhtmlのnameに代入というかデータの受け渡しが必要になるかと思うのですがそれはどのように記述すればいいのでしょうか?

ご教授よろしくお願いいたします。

Aベストアンサー

1.hiddenで値を回す(大抵は「値を引き継ぐ」と呼ばれます)
[form.php]
<form action="page1.php" method="POST">
<input type="text" name="name" />
<input type="submit" />
</form>

[page1.php]
<form action="page2.php" method="POST">
↓そのまま$_POSTの値を突っ込むとxssなどバグの温床になるんだけど。
<input type="hidden" name="name" value="<?php echo htmlspecialchars($_POST['name']); ?>" />
<input type="submit" />
</form>

[page2.php]
上記だとHTMLを排除された値が渡ってくることに注意
<?php echo $_POST["name"]; ?>


2.sessionを使って値を保持する
[form.php]
(snip)

[page1.php]
<?php
session_start();
$_SESSION['name'] = $_POST['name'];
?>

[page2.php]
<?php
session_start();
echo $_SESSION['name'];


sessionを使った方がセキュリティ的には強固 かつ 作成者的に負担が少ないので
個人的には2.をお勧めしたいところ。
cookieが使えないのであれば1.しか手法がありませんが。

1.hiddenで値を回す(大抵は「値を引き継ぐ」と呼ばれます)
[form.php]
<form action="page1.php" method="POST">
<input type="text" name="name" />
<input type="submit" />
</form>

[page1.php]
<form action="page2.php" method="POST">
↓そのまま$_POSTの値を突っ込むとxssなどバグの温床になるんだけど。
<input type="hidden" name="name" value="<?php echo htmlspecialchars($_POST['name']); ?>" />
<input type="submit" />
</form>

[page2.php]
上記だとHTMLを排除された値が渡っ...続きを読む

Q【SQL】取得項目を1レコードに並べるには?

こんにちは


【テーブル概要】
テーブルA(会員番号テーブル)
・会員番号(PK)

テーブルB(買い物情報テーブル)
・会員番号(PK)
・買い物月(PK)
・商品番号(PK)
・請求金額


【したいこと】
上記のようなテーブルがあった場合に、以下のような出力を行いたいと思っています。

会員番号,商品番号,買い物月(7月)の請求金額,買い物月(8月)の請求金額,買い物月(9月)の請求金額
--------,--------,-----------------------,-----------------------,-----------------------
会員1  ,商品1  ,          500,            ,          100
会員1  ,商品2  ,            ,          300,          100
会員2  ,商品1  ,          1500,          100,          100
会員3  ,商品3  ,            ,            ,          100
会員3  ,商品4  ,            ,          200,           

【試したこと】
一度、テーブルBを買い物月単位に割ってみました。

テーブルB_買い物月(7月)
・会員番号(PK)
・商品番号(PK)
・請求金額

テーブルB_買い物月(8月)
・会員番号(PK)
・商品番号(PK)
・請求金額

テーブルB_買い物月(9月)
・会員番号(PK)
・商品番号(PK)
・請求金額

それからINNER JOINで繋いでいけば、できるかと思ったのですが
実際の買い物月は結構過去まであり(2003年くらい)、ありえない程深いネストになってしまいます。。


どなたかお知恵をお貸し願います。

こんにちは


【テーブル概要】
テーブルA(会員番号テーブル)
・会員番号(PK)

テーブルB(買い物情報テーブル)
・会員番号(PK)
・買い物月(PK)
・商品番号(PK)
・請求金額


【したいこと】
上記のようなテーブルがあった場合に、以下のような出力を行いたいと思っています。

会員番号,商品番号,買い物月(7月)の請求金額,買い物月(8月)の請求金額,買い物月(9月)の請求金額
--------,--------,-----------------------,-----------------------,-----------------------
会員1  ,商品1  , ...続きを読む

Aベストアンサー

縦横変換の典型ですね。
サンプルを提示しますので、加工してください。

SELECT
会員番号,
商品番号,
'2008年' AS 年度,
SUM(CASE WHEN 買い物月 = 200801 THEN NVL(請求金額,0) END) 請求金額01月,
SUM(CASE WHEN 買い物月 = 200802 THEN NVL(請求金額,0) END) 請求金額02月,
SUM(CASE WHEN 買い物月 = 200803 THEN NVL(請求金額,0) END) 請求金額03月,
SUM(CASE WHEN 買い物月 = 200804 THEN NVL(請求金額,0) END) 請求金額04月,
SUM(CASE WHEN 買い物月 = 200805 THEN NVL(請求金額,0) END) 請求金額05月,
SUM(CASE WHEN 買い物月 = 200806 THEN NVL(請求金額,0) END) 請求金額06月,
SUM(CASE WHEN 買い物月 = 200807 THEN NVL(請求金額,0) END) 請求金額07月,
SUM(CASE WHEN 買い物月 = 200808 THEN NVL(請求金額,0) END) 請求金額08月,
SUM(CASE WHEN 買い物月 = 200809 THEN NVL(請求金額,0) END) 請求金額09月,
SUM(CASE WHEN 買い物月 = 200810 THEN NVL(請求金額,0) END) 請求金額10月,
SUM(CASE WHEN 買い物月 = 200811 THEN NVL(請求金額,0) END) 請求金額11月,
SUM(CASE WHEN 買い物月 = 200812 THEN NVL(請求金額,0) END) 請求金額12月
FROM テーブルB
where 買い物月 between 200801 and 200812
GROUP BY
会員番号,
商品番号;

ポイント
・CASEで該当するデータを横展開する。
・Group Byで横展開した値を集計し1列に集約する。

応用
 ・各カラムのデータ型にあわせてSQLを変更する。
  ※date型、number型、char型。
 ・上記は2008年に限定しているので、実際に欲しい形に変更する。
  ※年を意識しない作りにするなど。

縦横変換の典型ですね。
サンプルを提示しますので、加工してください。

SELECT
会員番号,
商品番号,
'2008年' AS 年度,
SUM(CASE WHEN 買い物月 = 200801 THEN NVL(請求金額,0) END) 請求金額01月,
SUM(CASE WHEN 買い物月 = 200802 THEN NVL(請求金額,0) END) 請求金額02月,
SUM(CASE WHEN 買い物月 = 200803 THEN NVL(請求金額,0) END) 請求金額03月,
SUM(CASE WHEN 買い物月 = 200804 THEN NVL(請求金額,0) END) 請求金額04月,
SUM(CASE WHEN 買い物月 = 200805 THEN NVL(請求金額,0) END) 請求金...続きを読む


人気Q&Aランキング