/ / mysql_query(“ SELECT…”)は、存在しない主キー値に対してNULL値の行を返し、レンダリング(mysql_num_rows> 0)役に立たないチェック-php、mysql、null、row

mysql_query(“ SELECT…”)は、存在しない主キー値に対してNULL値の行を返し、レンダリング(mysql_num_rows> 0)は役に立たないチェック - php、mysql、null、row

私は「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.

質問:

  1. 存在しない行を適切にチェックするにはどうすればよいですか?残りのスクリプトは、データを含む行を実際に取得した場合にのみ実行されるようにします。
  2. 私は見つけた mysql_store_result そして mysql_free_result これをオンラインで調査中ですが、ありません」それらを適切に機能させるのに十分な情報。私のコードのどこにそれらを配置するのか、どうして私は今必要なことをPHPなしで行うことができますか?
  3. PHPでmysqlデータベースを処理する際に、ここに欠けている「ベストプラクティス」のものはありますか?
  4. いくつかの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
}

これは、最後の行を読み取るまでループします。