質問: mysql_fetch_array($res,MYSQL_ASSOC); ``` ※p***URLsはテーブル名、urlはフィールド名。 ※データベースはさくらインターネットのものを使用しています。 ※home.phpのタブはjavascriptで作成しています。
回答: 参考にしているサイトが古いのと誤解を招く書き方をしてるので、いろいろまずいコードになってます。 PHP+MySQLの解説をしてるサイトのほとんどは古いか間違っているかその両方なので、なかなかここを参考にしたら間違いが無い、というのを知りません。 とりあえずサンプルを書いてみました。(SQLに突っ込むパラメータがどういう由来かわからないので唐突に登場させていますので、このままでは動きません) ``` setAttribute(PDO::ATTR_EMULATE_PREPARES, false); //INSERTを準備して・・・ $stmt = $dbh->prepare("INSERT INTO p***URLs (url) values (:url)"); if(!$stmt) { $error_info = $dbh->errorInfo(); die($error_info[2]); } //値を割り当てて・・・ $stmt->bindValue(":url", $p_url, PDO::PARAM_STR); //実行 $stmt->execute(); //SELECT $stmt = $dbh->prepare("SELECT * FROM p***URLs WHERE url = :url"); if(!$stmt) { $error_info = $dbh->errorInfo(); die($error_info[2]); } $stmt->setFetchMode(PDO::FETCH_ASSOC); $stmt->bindValue(":url", $get_id, PDO::PARAM_STR); $stmt->execute(); while ($row = $stmt->fetch()) { echo $row["url"]; } } catch(PDOException $e){ echo $e->getMessage(); } ?> ``` 参考にしてはいけないサイトを見分けるポイントを載せておきます。 * mysql_connectなどmysql_*系の関数は古いものなので使ってはいけません。これが載っていると言うことは情報が古いので参考になりません。mysqli_*か上記のPDOならよいです。 * 文字コードを指定している部分(上記のサンプルであれば、`new PDO`のパラメータで指定しています)があるかどうか。無ければダメです。 * PDOの場合、`setAttribute(PDO::ATTR_EMULATE_PREPARES, false)`が無い * SQLを組み立てるのに、`"SELECT * FROM test WHERE name = '" . $var . "'"` `"SELECT * FROM name = ${var}"`などのように変数を連結している。 * バインド機構について説明がない バインド機構というのは、 ``` $stmt = $dbh->prepare("SELECT * FROM p***URLs WHERE url = :url"); $stmt->bindValue(":url", $get_id, PDO::PARAM_STR); ``` こんな風に、SQL中には「プレースホルダ」という目印を置いて、後でそれに値を割り当てる(bindする)方法のことです。プレースホルダは`:url`のような名前の場合と`?`記号を使うときがあります。 なぜこういう注意が必要かについては、IPAが公開している「安全なウェブサイトの作り方」と「安全なSQLの呼び出し方」、書籍ですが「体系的に学ぶ 安全なWebアプリケーションの作り方」(ISBN: 978-4-7973-6119-3)を読んでみてください。