UPDATEとDELETEが出来ない。何故? - PHPプロ!Q&A掲示板

4920

  • 0P

UPDATEとDELETEが出来ない。何故?

質問日時 / 2018年2月9日 17:50 (最終編集:2月11日 14:58)    回答数 / 2件

Questioner:  jkdaisukihentai  このエントリーをはてなブックマークに追加 

キーワード / データベース    PHP    編集   

PHPを勉強して3週間くらいになります。
現在MySQLと連携した掲示板を作成しており、
編集機能と削除機能をSQL文によって実行するための実装に詰んでいます。

これが出来たら一通り目標は達成するのですが、
色々調べて試行錯誤しても原因が特定できず、
時間がただ流れてしまいました。

ご多忙のところ恐縮でございますが、
アドバイス、ご指摘のほど、よろしくお願いいたします。

エラー内容----
編集機能について
①フォームに再表示された名前、コメント、パスワードを編集する

②編集ボタンを押す($stmt = $pdo->query($sql); 実行)

③何も起こらない

echoで確認したところデータの受け渡しは問題なかった
※$stmtに返却値はあるか確認したところ実在しなかった
mysql_affected_rows()を実行した所「0」という数字が出ており、やはり実行されてなかった

削除機能について
①削除したい対象の投稿番号とパスワードを入力

②パスワードが一致すると
Fatal error: Call to a member function query() on a non-object in /home/co-666.99sv-coco.com/public_html/mission2-15.php on line 305
と出現。

※305行:$stmt -> $pdo->query($sql);
※上の行にあるSQL文がおかしいのだろうか
------------------------------------

---------------------------------------------
<?php
try{

DB接続とテーブル作成

}catch(PDOException $e){

echo $e->getMessage();
die();
}
?>


-略-
--------------------------------
入力、削除、編集用フォーム
--------------------------------
-略-


<?php

--略--
//投稿モード
--略--

?>



<?php
//編集機能前のパスワード認証----------------------------------------------------------------------------------------
//編集ボタン押されたら、新たにパスワード項目と編集対象番号項目があるフォームを表示
if(isset($_POST['edit_b'])){
?>
<!-編集指定用フォーム->
<html>
<form action ="mission2-15.php" method = "post">
パスワードと編集したい投稿番号を<font color = "red">半角数字</font>で入力してください。<br />
対象番号:<input type = "text" name = "edit_num" /><br />
password:<input type = "text" name = "password" /><br />
<input type = "submit" name = "edit_pass" value = "入力" /><br /><br />
</form>
</html>
<?php
}
//----------------------------------------------------------------------------------------------------------------
?>



<?php
//編集モード(送信ボタンを押されたかつedit_modeが1の場合)------------------------------------------------------------------------------------------
if( isset($_POST['send_b']) && ($_POST['edit_mode'] == 1) ){

$dsn = 'mysql:dbname=co_666_99sv_coco_com;host=localhost';
$user = 'co-666.99sv-coco';
$pass = '9BY4wUYS';
$pdo = new PDO($dsn,$user,$pass,array(PDO::ATTR_EMULATE_PREPARES=>false));

$edit_mode = 0;
$edit_num = $_POST['edit_num'];
$name = $info['namae'];
$info['comment'] = ereg_replace("\r\n|\n|\r","<br />",$info['comment']);
$comment = $info['comment'];
$password = $info['password'];
$date = date('Y/m/d H:i:s');
echo $edit_num.$name.$comment.$password;

$sql = "UPDATE 2ch_tb SET name = :name,comment = :comment,password = :password WHERE num_cun = $edit_num && password = :password;"; 
$stmt = $pdo->prepare($sql);

$param = array(':name'=>$name,':comment'=>$comment,':password'=>$password);

$stmt->execute($param);

//変更された行の数は0だった
echo " ".$stmt->rowCount();
}
?>



<?php
//削除機能前のパスワード認証-------------------------------------------------------------------------------------------
//削除ボタン押されたら新たにパスワード項目と削除対象番号項目があるフォームを表示
if(isset($_POST['del_b'])){
?>
<html>
<head>

<script type = "text/javascript">
function del_sure(){
return confirm("あなたの心に問いかけてください。本当に削除しますか?");
}
</script>

<head>
<form action ="mission2-15.php" onSubmit = "return del_sure();" method = "post">
パスワードと削除したい投稿番号を<font color = "red">半角数字</font>で入力してください。<br />
対象番号:<input type = "text" name = "del_num" /><br />
password:<input type = "text" name = "password" /><br />
<input type = "submit" name = "del_pass" value = "入力" /><br /><br />
</form>
</html>

<?php
}
//パスワード、番号が入力されてる状態で入力ボタン押したら削除機能へ-------------------------------------------------------
if(isset($_POST['del_pass']) && !empty($_POST['password']) && !empty($_POST['del_num'])){
$del_num = mysql_real_escape_string($_POST['del_num']);
$password = mysql_real_escape_string($_POST['password']);

//パスワードと投稿番号が一致する投稿番号データを抽出する. ここが上手く動いていない様子
$sql = "SELECT * FROM 2ch_tb WHERE num_cun='$del_num' && password='$password';";
$stmt -> $pdo->query($sql);

//パスワードと投稿番号が共に該当した場合削除
if($del_num == $stmt['num_cun'] && $password == $stmt['password']){
$sql = "delete from 2ch_tb WHERE num_cun = $del_num && password == $password";
$stmt = $pdo->query($sql);
echo <<< EOM
<script type = "text/javascript">alert("対象の投稿は削除されました。")</script>
EOM;
break;
   }
}
//接続を閉じる
$pdo = null;
?>

この質問への意見の募集は締め切られ、ポイントは既に配分されました。
意見を投稿することはできますが、ポイントを受け取ることはできません。



ツリー一覧

┗A01shimix#あまりにソースが長いので、全部は読んでいません(
 ┗A01-1jkdaisukihentai大変失礼いたしました。 コードを出来る限り削減いた

回答一覧

並び替え:

A01
answerershimix [2月9日 19:06]

#あまりにソースが長いので、全部は読んでいません(汗

queryメソッドの戻り値はPDOステートメントです、真偽値でも更新件数でもありません。PDOステートメントのrowCount()に更新件数は格納されます。

(例)
  1. <?php
  2. try{
  3.   $dsn = 'mysql:host=localhost;dbname=test;charset=utf8mb4';
  4.   $user = 'root';
  5.   $pass = '';
  6.   $pdo = new PDO($dsn$user$pass[PDO::ATTR_ERRMODE=> PDO::ERRMODE_EXCEPTION]);
  7.  
  8.   $id = 1;
  9.   $name = 'XXX';
  10.   $stmt = $pdo->prepare('update temp set name=? where id=?');
  11.   $stmt->execute([$name$id]);
  12.   echo $stmt->rowCount();
  13. } catch (PDOException $e) {
  14.   die($e->getMessage());
  15. }




以下蛇足

ところどころに、mysql_real_escape_string関数が出てきますが、これはどういう意味で使っているのでしょうか?PDOを使うのですからprepare/executeでプレースホルダ(名前付きパラメータもしくは疑問符パラメータ)を利用すべきです。自前でエスケープする必要はありません。

#ネイティブなMySQL関数はとっくの昔に非推奨です(php7では廃止)

そもそも提示されたソースにはmysql_connect()もmysql_set_charset()も見当たりませんので、mysql_real_escape_string()がちゃんと動作するとは思えません。mysql_affected_rows()も含めてなぜエラーにならないのか不思議です(手元はすでにphp7で検証する環境がありません)。

この意見に回答する

ツリーへ TOPへ

A01-1
replyerjkdaisukihentai [2月11日 14:59]

大変失礼いたしました。
コードを出来る限り削減いたしました。

参考になるアドバイスを誠にありがとうございます。

この意見に回答する

ツリーへ TOPへ

<<質問一覧へ



Pick Up Q&A

Q
ログファイルの中の空のデータ行を削除したい
 このエントリーをはてなブックマークに追加 
A
ログのデータ個数(列数)が固定で、空のログが"<><><>"だと既知であれば if ($line === "<><><>") { continue; } で読み飛ばしてもいいのでは? ...

>>続きを読む

まずは配列や文字列の扱いから、じっくり勉強して行きましょう。

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)