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

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

ただいまの
回答率

89.62%

質問が古くなり改めての質問、ラジオボタンで選択したレコードをHP上からDELETEできない件、お願いいたします。

解決済

回答 2

投稿 ・編集

  • 評価
  • クリップ 0
  • VIEW 1,391
質問が古くなりましたので改めて質問いたします。 
HP上からDBに登録したレコードを削除しようと以下の手順で記述してみましたが、最後がif(flag){elseの結果になってしまいますどなたかお導きいただけませんでしょうか。 
DBには primary、auto_incrementで設定したc0de、全角文字8字までの名前が入ったstaff_namae、md6方式で32桁の暗号化された英数字のパスワードがstaff_passに入っています。 
sql文以外同じ内容でUPDATE文は成功していますのでmysql=DELETE・・・からdbh = nullの間に原因があるのではないかと思いますが、それが何かが分かりませんどうかよろしくお願いいたします。 
DB構造   
mysql> show fields from mst_staff;   
+-------------+-------------+------+-----+---------+----------------+   
| Field       | Type        | Null | Key | Default | Extra          |   
+-------------+-------------+------+-----+---------+----------------+   
| code        | int(11)     | NO   | PRI | NULL    | auto_increment |   
| staff_namae | varchar(16) | NO   |     | NULL    |                |   
| staff_pass  | varchar(32) | NO   |     | NULL    |                |   
+-------------+-------------+------+-----+---------+----------------+   
一覧   
$dsn='mysql:dbname=shopdb;host=localhost';   
$user='root';   
$password='';   
$dbh=new PDO($dsn,$user,$password);   
$dbh->query('SETNAMES utf8');   

    $sql = 'SELECT code,staff_namae FROM mst_staff WHERE 1';   
    $stmt=$dbh->prepare($sql);   
    $stmt->execute();   

    $dbh = null;   

    print    'スタッフ一覧<br /><br />';   

    print    '<form method="post" action="staff_branch.php">';   
    while(true)   
    {   
    $rec = $stmt->fetch(PDO::FETCH_ASSOC);   
       
    if($rec==false)   
    {   
    break;   
    }   
    print '<input type="radio" name="staffcode" value="'.$rec['code'].'">';   
    print $rec['staff_namae'];   
    print '</br>';   
    }   
    print '</br>';   
    print     '<input type="submit" name="edit" value="修正">';   
    print     '<input type="submit" name="delete" value="削除">';   
見えないページ"staff_branch.php"で修正と削除の処理分岐  <?php 
if(isset($_POST['edit'])==true) 

if(isset($_POST['staffcode'])==false) 

header('Location:staff_ng.php'); 

$staff_code=$_POST['staffcode']; 
header('Location:staff_edit.php?staffcode='.$staff_code); 

if(isset($_POST['delete'])==true) 

if(isset($_POST['staffcode'])==false) 

header('Location:staff_ng.php'); 

$staff_code=$_POST['staffcode']; 
header('Location:staff_delete.php?staffcode='.$staff_code); 

?> 
削除確認 
<body> 
<div id="contents"> 
<?php 

try 



if (isset($_GET["staffcode"])) { 
    $staff_code= $_GET['staffcode']; 


$dsn='mysql:dbname=shopdb;host=localhost'; 
$user='root'; 
$password=''; 
$dbh=new PDO($dsn,$user,$password); 
$dbh->query('SETNAMES utf8'); 

$sql = 'SELECT staff_namae FROM mst_staff WHERE code=?'; 
$stmt=$dbh->prepare($sql); 
$data[0]=$staff_code; 
$stmt->execute($data); 

$rec = $stmt->fetch(PDO::FETCH_ASSOC); 
$staff_namae=$rec['staff_namae']; 

$dbh = null; 


catch    (Exception $e) 
    { 

print    'ただいま障害により、たいへんご迷惑をお掛けしております。'; 
        exit(); 
    } 
     
     
?> 

<h3>スタッフ削除</h3><br /> 
<br /> 
<br /> 

<h3>スタッフコード</h3><br /> 
<?php print $staff_code;?> 
<br /> 
<br /> 

<h3>スタッフ名</h3><br /> 
<?php print    $staff_namae;?> 
<br /><br /> 
<h3>みのスタッフを削除してもよろしいですか?</h3><br /><br /> 
<form method="post" action="staff_delete_done.php"> 
<input type="hidden" name="staffcode" value="<?php print $staff_code;?>"> 

<br> 

<input type="hidden" onclick="history.back()" value="戻る"> 
<br /><br /> 
<input type="submit" value="削除実行"> 
</form>  
</div> 
</body> 
削除実行   
<?php  

try  
{  

if (isset($_POST["staffcode"])) {  
    $staff_code = $_POST['staffcode'];  
}  

$dsn='mysql:dbname=shopdb;host=localhost';  
$user='root';  
$password='';  
$dbh=new PDO($dsn,$user,$password);  
$dbh->query('SETNAMES utf8');  

$sql = 'DELETE FROM mst_staff WHERE code? = delete code';  
$stmt = $dbh->prepare($sql);  
        $data[0] = $staff_code;  
$flag = $stmt->execute(array($data[0]));  

$dbh = null;  

if ($flag){  
    print    ('データーを削除しました。<br />');  
    }  
    else{  
    print    ('データーを削除できませんでした。<br />');  
      
}  
}  
catch(Exception $e)  
{  

print    'ただいま障害により、たいへんご迷惑をお掛けしております。';  
exit();  
}  

?>  

<h3><a href="staff_list.php">スタッフ一覧へ</a></h3>
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

goufさんの回答にあるような対応も最終的には必要ですが、
現時点の問題は、エラーを出力してみないと何が起きているかわかりません。
最終的には過去の質問の回答にある方法で対応する必要がありますが、
1行追加のレベルでエラーをとりあえず出力してみるには、以下のようなコードをexecuteの直後に追加すると出力されます。
print '<p>errorInfo='.print_r($stmt->errorInfo(), true)."</p>\n";
試してみてください。
PDOの初期状態のエラーモードでは、なにか実行するたびに、上記のようなエラー出力を追加しないと何が起きているかわかりません。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2014/12/22 14:00

    ありがとうございます。
    エラーが検出できました。
    やはり、DELETE文の構文エラーではないかと思われますがどこをどうすればよいかわからないので、また明日、質問させていただきます。

    キャンセル

  • 2014/12/22 14:34

    MySQLサーバにmysqlコマンドなどで直接DELETEを実行してエラーになるものはPHPでやっても同じことです。まずは想定するSQL文を手動で構築して、直接MySQLサーバに対してDELETEのSQLを実行してみるほうがいいかと思います。

    キャンセル

  • 2014/12/22 14:38

    過去の質問の回答で正しいSQLになるはずのものがあったようですが、実行に失敗したとのコメントになっていました。
    例えば、codeが1のレコードをINSERTしておき、以下のSQLを実行するとどうなるでしょうか?
    DELETE FROM mst_staff WHERE code = 1

    キャンセル

+1

* 質問中に出てくるコードは1ファイルなコードなのでしょうか?
* それともコード中に登場するファイル名の、複数ファイルのそれら一部なのでしょうか?
(回答の前の疑問がとして、質問の内容がとてもぼやけているように感じてしまいます)

コードの内容が長くなる場合は、たとえばGist などのサービスにアップロードしていただけると、行番号の表示に対応しているので 注目すべきコードブロックの位置の指示、そして複数ファイルのアップロードに対応しているのでファイルごとにコードを表示させるなど、コードとその質問の内容に集中しやすくなります

行末の余分な空白、インデントがあったりなかったり、print メソッドの利用でカッコがあったりなかったりでコードの統一性が見られず すこし読みづらい印象でした
もし、なにかのコーディング規約を導入されていないのでしたら、たとえばPSR のようなコーディング規約の導入をされることをおすすめします

SQL に関しては、学習のためでもない限り、CRUD な基本操作は自身で書く利点があまり無いように思います

PHP での複数ページの表示が必要であれば、たとえばCake PHPFuel PHPLravel のようなフレームワークの導入を検討されてはいかがでしょうか

## Links
How to create insert/update/delete Prepared statements with PDO for PHP Code Example - Runnable
INSERT, UPDATE and DELETE with PDO
fig-standards/PSR-2-coding-style-guide.md at master · php-fig/fig-standards
The PHP Coding Standards Fixer for PSR-1 and PSR-2
PHPフレームワーク比較 2014年 | 既にプログラマー

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 89.62%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる
  • トップ
  • PHPに関する質問
  • 質問が古くなり改めての質問、ラジオボタンで選択したレコードをHP上からDELETEできない件、お願いいたします。