我正在更新一个mysql表。我得到如下错误
警告:mysql_fetch_array()期望参数1是资源,布尔值在C:xampphtdocstestedit.php中第232行给出错误。你有一个错误在你的SQL语法;查看与MySQL服务器版本对应的手册,了解在"at line 1
"附近使用的正确语法。
查询似乎没有产生结果。我通过一个url传递一个id到一个函数,但变量似乎死了,虽然它似乎在范围内。可能是我的错误。下面是更新的循环。我已经注释掉了一些行,我认为这是一个问题,但他们是好的。黑体代码是问题行。
elseif(isset($_POST['editSelection']))
{
// check if form is submitted
//collect variables posted by form.
$fixture_id = mysql_real_escape_string($_POST['fixture_id']);
$goalkeeper = mysql_real_escape_string($_POST['goalkeeper']);
$defender = mysql_real_escape_string($_POST['defender']);
$fullback = mysql_real_escape_string($_POST['fullback']);
$midfielder = mysql_real_escape_string($_POST['midfielder']);
$wing = mysql_real_escape_string($_POST['wing']);
$striker = mysql_real_escape_string($_POST['striker']);
$sid = mysql_real_escape_string($_POST['sid']); // receive the selection_id which was posted from the hidden field in the editForm
$sql = "SELECT * FROM `selections` WHERE selection_id = {$sid}";
$data = mysql_query($sql);
**while($rows = mysql_fetch_array($data))
{
$opponents = $rows['opponents'];
}**
//validate form by checking for empty strings that user might have submitted using strlen() php built-in method. If no empty string form processes
//if(strlen($fixture_id)>0 && strlen($goalkeeper)>0 && strlen($defender)>0 && strlen($fullback)>0 && strlen($midfielder)>0 && strlen($wing)>0 && strlen($striker)>0 && strlen($selection_id)>0) { // if form fields are not empty, update Selection record in database
$sql = "UPDATE `selections` SET goalkeeper ='{$goalkeeper}' WHERE selection_id = {$sid}";
$query = mysql_query($sql) or die("Error executing query ".mysql_error());
echo "Selection updated <br/><br/>";
echo "<a href="team_selections.php">Go back to Team Selections page </a>";
//}
}
echo"<tr><td>Midfielder</td><td><select name="midfielder">";
$sql = "SELECT name FROM `player` ";
$data = mysql_query($sql);
while($rows = mysql_fetch_array($data)){
echo "<option value={$rows['name']}>";
echo $rows['name'];
echo "</option>";
}
echo "</select>";
echo "</td></tr>";
echo"<tr><td>Wing</td><td><select name="wing">";
$sql = "SELECT name FROM `player` ";
$data = mysql_query($sql);
while($rows = mysql_fetch_array($data)){
echo "<option value={$rows['name']}>";
echo $rows['name'];
echo "</option>";
}
echo "</select>";
echo "</td></tr>";
echo"<tr><td>Striker</td><td><select name="striker">";
$sql = "SELECT name FROM `player` ";
$data = mysql_query($sql);
while($rows = mysql_fetch_array($data)){
echo "<option value={$rows['name']}>";
echo $rows['name'];
echo "</option>";
}
echo "</select>";
echo "</td></tr>";
echo "<tr><td></td><td><input type="hidden" value="{$rows['selection_id']}" name="sid"></td></tr>"; // create hidden field with selection_id which enables the right selection to be edited
echo "<tr><td></td><td><input type="submit" value="Update Selection" name="editSelection"></td></tr>";
echo "</table></form>";
} //end of while loop
}
mysql_query()
如果工作则返回结果集,如果不工作则返回false
。事实上,你得到投诉从mysql_fetch_array()
使用布尔值,其中一个结果集是必需的,这意味着查询已经返回false
(即,它没有工作)。
你应该这样写:
$data = mysql_query($sql) or die (mysql_error());
来查看实际的错误是什么,尽管我希望在生产代码中看到一些更健壮的东西。不过,这应该足以确定当前的问题。
您可能还希望在尝试执行查询之前实际输出查询,例如,$sid
有问题,例如它是空的,或者它是一个字符串,而您的查询似乎需要一个数值。
如果是字符串,您需要用单引号将{$sid}
括起来:
$sql = "SELECT * FROM selections WHERE selection_id = '{$sid}'";
如果为空,则需要跟踪原因,因为这会给您无效的查询:
SELECT * FROM selections WHERE selection_id =
当然,您应该尽可能使用mysqli_*
函数,因为mysql_*
函数已被弃用。
您是否尝试添加mysql_error()来查看您正在获得的错误消息?改变这个:
$data = mysql_query($sql);
:
$data = mysql_query($sql) or die(mysql_error());
你收到的消息是说查询的结果是真/假,而不是mysql的"资源"。MySQL资源是MySQL查询的正常响应,它们可以通过mysql_fetch_array或mysql_fetch_assoc等来"读取"。
所以如果你得到一个真/假的响应,那么这个特定的查询并没有给你你想要的数据。和我一起排除故障:为什么会发生这种情况?
试试这个:
"SELECT * FROM `selections` WHERE `selection_id` = '$sid'";
同样,回显$sid的值,这样您就可以看到它里面有一些东西。在mysql_fetch_array中也不能使用null返回值。
也试着回显整个$_POST,看看到底收到了什么:
echo '<pre>';
print_r($_POST);
echo '</pre>';