-2

関数内から$row(データベース配列)を呼び出そうとしていますが、変数に基づいて列名を呼び出しています。

これが完全なコードです...あなたはで結果を見ることができます

http://tlcs.stuart-pinfold.co.uk/test.php?id=20

http://tlcs.stuart-pinfold.co.uk/test.php?id=21

<?php
include("includes/db.php"); // includes all the db connections

$id = $_GET['id'];

$sql = "SELECT * FROM users WHERE UserID='".$id."'";
$set = mysql_query($sql);
$row = mysql_fetch_array($set);

function checkAvailability($day)
{
 $check = "UserCommute".$day;
 if($row[$check]=="1")
 {
  echo '<img src="/tick.jpg" alt="Available on this day" />';
 }
 else
 {
  echo '<img src="/cross.jpg" alt="Not available on this day" />';
 }
 echo " = ".$check."<br/>";
}

echo "Full Name:<br/>".$row['UserFullName']; // this works perfectly

echo "<br/><br/>Using the function...<br/>";

echo checkAvailability('Mon');
echo checkAvailability('Tue');
echo checkAvailability('Wed');
echo checkAvailability('Thu');
echo checkAvailability('Fri');
echo checkAvailability('Sat');
echo checkAvailability('Sun'); // these always return a cross even when the database entry is 1

echo "<br/>Using hard-coded row values...<br/>";

echo $row['UserCommuteMon']." = UserCommuteMon<br/>";
echo $row['UserCommuteTue']." = UserCommuteTue<br/>";
echo $row['UserCommuteWed']." = UserCommuteWed<br/>";
echo $row['UserCommuteThu']." = UserCommuteThu<br/>";
echo $row['UserCommuteFri']." = UserCommuteFri<br/>";
echo $row['UserCommuteSat']." = UserCommuteSat<br/>";
echo $row['UserCommuteSun']." = UserCommuteSun<br/>"; // these work perfectly, returning 0s or 1s, matching the database

?>

クロスのみを返し、ティックは返しません。

どこが間違っているのですか?

4

3 に答える 3

5

関数を定義していますが、関数内にはスコープはありません$row

そこで、ユーザーが特定の日に利用可能かどうかを確認する新しいクエリを定義するか、関数を削除して、関数のないフィールドを比較します。

したがって、行う代わりにcheckAvailability('Mon');

if($row["UserCommuteMon"] === 1) {

}

または$rowあなたの機能に与えます。好きcheckAvailability($row, 'Mon');

$_GET['id']そして、SQLインジェクションを防ぐためにあなたをきれいにすることを忘れないでください。

于 2012-12-16T10:35:07.647 に答える
1

コードに複数の問題があり、大幅に改善できます。

匿名関数への切り替えを検討してください。

$checkAvailabilityDay = function($day) use ($row)
{
    $key   = "UserCommute$day";
    $check = $row[$key] == 1;
    echo '<img src="/', $check ? 'tick' : 'cross', '.jpg" alt="',
         $check ? 'Available' : 'Not available', ' on this day" />',
         "$key<br />\n";
}

それらは、それらが定義されているスコープから変数を使用(インポート)することを可能にします。これは、ここで$row変数に使用されます。これらの関数は、他の関数と同じように使用できます。たとえば、すべての日の出力のコールバックとして使用できます。

array_map($checkAvailabilityDay, ['Mon', Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']);

これがお役に立てば幸いです。mysql_*また、多くの理由でドロップする必要があります。PDOまたはmysqliへの切り替えを検討してください。

于 2012-12-16T10:57:24.957 に答える
0

皆さんありがとう。私は(私の意見では)はるかに非効率的になってしまいました:

<?php

if($row['UserCommuteMon']===1)
{
 echo '<img src="/tick.jpg" alt="Travels on this day" class="availIcon" />';
}
else
{
 echo '<img src="/cross.jpg" alt="Does not travel on this day" class="availIcon" />';
}
echo "Mon";

if($row['UserCommuteTue']===1)
{
 echo '<img src="/tick.jpg" alt="Travels on this day" class="availIcon" />';
}
else
{
 echo '<img src="/cross.jpg" alt="Does not travel on this day" class="availIcon" />';
}
echo "Tue";

if($row['UserCommuteWed']===1)
{
 echo '<img src="/tick.jpg" alt="Travels on this day" class="availIcon" />';
}
else
{
 echo '<img src="/cross.jpg" alt="Does not travel on this day" class="availIcon" />';
}
echo "Wed";

etc...

?>
于 2012-12-16T10:52:15.407 に答える