私は「mysqlをphpで使用するのは非常に初めてであり、これが結果を取得するためにオンラインで見つけたものです」:
$con = mysql_connect(localhost,$username,$password);
@mysql_select_db($database) or die("Cannot connect to the database");
$query = "SELECT ... FROM ... WHERE ID=5";
$result = mysql_query($query);
$num = mysql_num_rows($result);
if ($num > 0 ) {
// do stuff
} else {
// inform user
}
mysql_close($con);
ID
テーブルの自動生成された非null主キーです。現在、テーブルには20個のレコードがあります。 ID
これらの既存のレコードのいずれかに対応する値、すべてがうまくいき、意図したとおりに動作します。
ただし、私が入力した場合 ID
たとえば、54の値、または既存の20個のレコードのいずれにも対応しないもの(このような ID
存在する)、私は期待する $num <= 0
私の条件文は else
ブロック。しかし、私はそれがケースではなかったことがわかりました-それはまだに行きます TRUE
分岐して進む // do stuff
ブロックするので、phpmyadminでクエリを実行しました。 NULL
すべてのフィールドで。それが理由です $num
戻ってきた 1
それは >0
.
質問:
- 存在しない行を適切にチェックするにはどうすればよいですか?残りのスクリプトは、データを含む行を実際に取得した場合にのみ実行されるようにします。
- 私は見つけた
mysql_store_result
そしてmysql_free_result
これをオンラインで調査中ですが、ありません」それらを適切に機能させるのに十分な情報。私のコードのどこにそれらを配置するのか、どうして私は今必要なことをPHPなしで行うことができますか? - PHPでmysqlデータベースを処理する際に、ここに欠けている「ベストプラクティス」のものはありますか?
- いくつかのSQL文を呼び出さなければならないとき、私がやることは
$query
-$result
-$num
私の前に処理するmysql_close
私の接続。それは「ベストプラクティス」ですか?
本当にありがとうございます
更新: クエリ全体を含める
SELECT Dyna,
Floater,
Can.Label as CanLabel,
GROUP_CONCAT(DISTINCT Vanity.Name SEPARATOR ", ") as VanityName,
GROUP_CONCAT(DISTINCT Univ SEPARATOR ", ") as Univ,
ShopDate,
ManuDate,
FlipTran,
Remarks,
Bib,
Abbrev,
ShopChar,
Comment,
Value,
ERUSD
FROM
(Vanity INNER JOIN ((Vanity INNER JOIN Shoppy ON Vanity.VanityID = Shoppy.VanityID) INNER JOIN ShoppyVanity ON Shoppy.ID = ShoppyVanity.ID) ON Vanity.MethodID = ShoppyVanity.MethodID) INNER JOIN UAC ON (Shoppy.VanityID = UAC.VanityID) AND (Vanity.VanityID = UAC.VanityID)
WHERE (((Shoppy.ID)=5))
回答:
回答№1は2次のようなグループ集約関数を使用する場合 GROUP_CONCAT
MySQLは、結果セット全体からグループを作成します。結果がない場合、それらを実行します NULL
代わりに値、空の行になります。これをクエリの最後に追加して、有効なデータが含まれていない行を削除してみてください。
HAVING VanityName IS NOT NULL
回答№2の場合は1
$num = mysql_numrows($result);
それに変更する
$num = mysql_num_rows($result);
回答№3の場合は0
これを試して:
SELECT Dyna,
Floater,
Can.Label as CanLabel,
GROUP_CONCAT(DISTINCT Vanity.Name SEPARATOR ", ") as VanityName,
GROUP_CONCAT(DISTINCT Univ SEPARATOR ", ") as Univ,
ShopDate,
ManuDate,
FlipTran,
Remarks,
Bib,
Abbrev,
ShopChar,
Comment,
Value,
ERUSD
FROM
Vanity INNER JOIN Shoppy ON (Vanity.VanityID = Shoppy.VanityID)
INNER JOIN ShoppyVanity ON (Shoppy.ID = ShoppyVanity.ID)
INNER JOIN ShoppyVanity ON (ShoppyVanity.MethodID=Vanity.MethodID)
INNER JOIN UAC ON (Shoppy.VanityID = UAC.VanityID AND Vanity.VanityID =UAC.VanityID)
WHERE Shoppy.ID=5
回答№4の場合は0
異なる mysql_*
関数など mysql_fetch_assoc
。マニュアルを読む場合は、 http://www.php.net/manual/en/function.mysql-fetch-assoc.php、あなたはそれが戻ることがわかります false
取得する行がない場合。通常、その呼び出しを条件付きの while
ループ、すなわち:
while( $row = @mysql_fetch_assoc( $result ) ){
// do something
}
これは、最後の行を読み取るまでループします。