ZAMPPを使用しPHP/MYSQLの勉強をし始めた者です。以下のエラーが出て先に進めません。どこが悪いのか教えてください。
Warning: mysql_real_escape_string() [function.mysql-real-escape-string]: Access denied for user 'ODBC'@'localhost' (using password: NO) in C:\xampp\htdocs\todo.php on line 33
Warning: mysql_real_escape_string() [function.mysql-real-escape-string]: A link to the server could not be established in C:\xampp\htdocs\todo.php on line 33
問題のプログラムです。
<?php
//----------------------------------------------------------------------
//TODO管理プログラム
//----------------------------------------------------------------------
$db_dns = "mysql:host=localhost;dbname=phptest;";
$user = "root";
$pass = "";
//-------SQL
$create_query = <<<______
CREATE TABLE items(
todo_idINTEGER PRIMARY KEY AUTO_INCREMENT,
memoTEXT,
flagTEXT,
ctimeINTEGER);
______;
//-----------------------------------------------------------------------
//データベースの初期化
$db = new PDO($db_dns,$user,$pass);
//データベースが利用できるか確認
$select_stmt = $db->query("SELECT*FROM items LIMIT1");
if(!$select_stmt){//テーブが作成されていない場合
$db->exec($create_query);
$now = time();
$db->exec("INSERT INTO items(memo,flag,ctime)".
"VALUES('データの初期化','done',$now)");
}
//------------------------------------------------------------------------
//TODOを追加する
if(isset($_GET['newitem']) && $_GET['newitem'] != ""){
$memo = mysql_real_escape_string($_GET['newitem']);
$now = time();
$db->exec("INSERT INTO items(memo,flag,ctime)".
"VALUES('$memo','new',$now)");
}
//TODOを消化する
$to_id = intval($_GET['done']);
if ($todo_id > 0){
$db->exec("UPDATE items SET flag='done'".
"WHERE todo_id=$todo_id");
}
//-----------------------------------------------------------------------------
//現在のTODOを表示するHTML
$list = "";
//未消化のTODOを抽出
$sql="SELECT*FROM items WHERE flag='new'ORDER BY ctime DESC";
$r = $db->query($sql);
foreach ($r->fetchALL() as $row){
$todo_id = $row["todo_id"];
$memo = htmlspecialchars($row["memo"]);
$ctime = date("Y-m-d",$row["ctime"]);
$btn = "[<a href = '?done=$todo_id'>x</a>]";
$list .= "<li>$btn $memo ($ctime)</li>";
}
//消化済みTODOを最大5件抽出
$sql = "SELECT * FROM items WHERE flag = 'done'".
"ORDER BY ctime DESC LIMIT 5";
$r = $db->query($sql);
foreach ($r->fetchALL() as $row){
$memo = htmlspecialchars($row["memo"]);
$ctime = date("Y-m-d",$row["ctime"]);
$list .= "<li><s>$memo ($ctime)</s></li>";
}
//-------------------------------------------------------------------------------
//以下でHTMLを表示
?><html><body>
<h1>TODO</h1>
<?php echo $list ?>
<form>
<h3>新しいTODO</h3>
<input type = "text" name= "newitem"/>
<input type ="submit" value="追加"/>
</form>
</body></html>
本当に困り果てています。賢者の方、知恵をお貸しください。
No.2ベストアンサー
- 回答日時:
エラーの原因は、mysql_real_escape_string 関数の使用方法の誤りです。
【エラー場所】
33行目:$memo = mysql_real_escape_string($_GET['newitem']);
PHPの関数リファレンスを確認すると、以下の記載があります。
説明
---------------------
string mysql_real_escape_string (
string $unescaped_string [, resource $link_identifier ] )
link_identifier
---------------------
MySQL 接続。指定されない場合、mysql_connect() により
直近にオープンされたリンクが指定されたと仮定されます。
そのようなリンクがない場合、引数を指定せずに
mysql_connect() がコールした時と同様にリンクを確立します。
リンクが見付からない、または、確立できない場合、
E_WARNING レベルのエラーが生成されます。
macatoさんのプログラムでは、PDOにてDB接続を行っています。
21行目:$db = new PDO($db_dns,$user,$pass);
mysql_connect 関数にて作成した
DBリンク(コネクション)がないために、
エラーが発生します。
PDOでDBリンクを作成しているので、
SQLのサニタイズは、
PDOのプリペアドステートメントを
利用なさるのが、正しいと思います。
以下にプログラムのサンプルを記載します。
※動作確認は行っていませんので悪しからず。
$memo = trim($_GET['newitem']);
$now = time();
$sth = $dbh->prepare("INSERT INTO items(memo,flag,ctime) VALUES (?, 'new', ?)");
$sth->bindParam(1, $memo);
$sth->bindParam(2, $now);
$sth->execute();
No.1
- 回答日時:
mysql_real_escape_string() は、mysql_connect() での接続が確立しなければ使えません。
PDO を使うならば、プリペアードステートメントを使いましょう。
MySQL4.0 との接続でも、エミュレートされてます。
http://jp.php.net/manual/ja//pdo.prepare.html
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP PHP MySql ページング 2 2022/09/20 06:38
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- PHP if(preg_match("/[^0-9]/",$gu_d)){意味を教えてください。 1 2022/05/06 05:37
- PHP ここでの ②if($su_d<>"")の比較演算子 を使う理由は 1 2022/03/26 02:33
- PHP php テーブルが作成できない 1 2022/11/17 23:41
- PHP php エラー 2 2022/10/23 16:43
- PHP 重複を防ぐ記述について教えて下さい。 3 2023/04/03 14:35
- PHP DBのハッシュ化したパスワードをpassword_verifyで戻し照合したのですが上手く行きません 2 2023/02/06 13:24
- MySQL php テーブルを作れない 2 2022/11/17 18:22
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
会員登録したらメールが送られ...
-
期待した値がMySQLから返ってこ...
-
MySQLのUPDATE実行結果を受け取...
-
縦に長い<table>でなく横に長い...
-
PHPからMySQL・異なるDBにコピー
-
MySQLのデータを使ってプルダウ...
-
PHP + MySQLを使用して詳細画面...
-
php テーブルを作れない
-
VBAをつかってクエリの情報を抽...
-
エラー3011
-
MySQLのINSERT時にたまに重複に...
-
テキストボックスに入れた内容...
-
エクセルVBAについて
-
エクセルVBAのデータベース接続...
-
外部結合で参照列が複数あるSQL
-
PHP 勤務時間の合計を出したい
-
テーブル内の文字によりログイ...
-
phpのif文について
-
アカウント検索(データベース...
-
データをDBからひっぱってき...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
mysql_fetch_objectのエラー
-
XAMPPで画面が真っ白になります。
-
テーブルに入っているデータと...
-
sqlから多次元配列に要素を格納...
-
PHP+mysqlでSQL文に文字数制限...
-
stringaddslashes 半角¥が消える
-
phpのエラーについてです
-
PHPで絞り込み検索結果の件数を...
-
PHPエラーが出て困ってます
-
PDOを使いたい
-
CSVをダウンロードさせた際、CS...
-
mysql_query等でレコード数を変...
-
Resource id #3 をフィールドの...
-
ボタンのonclick時における関数...
-
XAMMPが起動しません。
-
SQL文2つ実行
-
PHPのSQLインジェクションはspr...
-
SQLの結果が返ってこない
-
MySQLのデータを使ってプルダウ...
-
会員登録したらメールが送られ...
おすすめ情報