我知道堆栈溢出已经完全涵盖了这一点,但我无法弄明白。我是PHP和SQL命令的新手,所以请耐心等待。
这是我的代码:
$connection = mysql_connect($serverName, $userName, $password) or die('Unable to connect to Database host' . mysql_error());
$dbselect = mysql_select_db($dbname, $connection) or die("Unable to select database:$dbname" . mysql_error());
$studentid = $_POST['student_id'];
$result = mysql_query($connection,"SELECT `first_name` FROM `students` WHERE student_id = '$studentid'");
while($row = mysqli_fetch_array($result))
echo $row['first_name']
我确信这可能是非常愚蠢的事情。我知道我应该使用mysqli或其他东西,但这只是一个测试项目,教我一些基础知识。
student_id来自之前的php页面,我希望它能够查找student_id并显示学生的名字,我从名为students的表中输入echo,但是我在页面上什么都没有,并且没有条目错误日志。
student_id既是列的名称,也是上一个php页面上输入字段的名称。
另外,我不知道它是否有所作为,但$ connection连接到while语句的代码在一个
有什么建议吗?
感谢。
答案 0 :(得分:2)
你正在混合你的MySQL API,它们“不”混合。
如果您真的想使用mysqli_fetch_array
mysql_fetch_array
更改为mysql_*
另外,请加入一些支持:
while($row = mysql_fetch_array($result)) // missing brace
echo $row['first_name'] // <= missing semi-colon
和echo $row['first_name']
while($row = mysql_fetch_array($result)){
echo $row['first_name'];
}
此外,您的数据库连接在最后,而不是在开头:与mysqli_*
方法不同,它首先出现。使用mysql_
,连接结束。如果您确实想使用mysqli_*
函数,则需要将所有mysql_
更改为mysqli_
(后面跟着)。
$result = mysql_query($connection,"SELECT `first_name` FROM `students` WHERE student_id = '$studentid'");
由于已建立数据库连接,因此不需要。 (虽然我把它放在了最后)。
$result = mysql_query("SELECT `first_name` FROM `students` WHERE student_id = '$studentid'",$connection);
另外,如果您仍然热衷于使用基于$studentid = mysql_real_escape_string(strip_tags($_POST['student_id']), $connection);
的功能,请使用mysql_*
获得额外保护。
将错误报告添加到文件顶部,这将有助于生产测试。
error_reporting(E_ALL);
ini_set('display_errors', 1);
MySQL(错误报告链接)
这是一个基于mysqli_
的完整方法:将mysqli_real_escape_string()
添加到POST变量。
error_reporting(E_ALL);
ini_set('display_errors', 1);
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$connection = mysqli_connect($serverName, $userName, $password, $dbname)
or die('Unable to connect to Database host' . mysqli_error());
$studentid = mysqli_real_escape_string($connection,$_POST['student_id']);
$result = mysqli_query($connection,"SELECT `first_name` FROM `students` WHERE student_id = '$studentid'");
while($row = mysqli_fetch_array($result)){
echo $row['first_name'];
}
从技术上讲......
mysql_*
函数弃用通知:
http://www.php.net/manual/en/intro.mysql.php
从PHP 5.5.0开始,不推荐使用此扩展,不建议用于编写新代码,因为将来会删除它。相反,应使用mysqli或PDO_MySQL扩展名。在选择MySQL API时,另请参阅MySQL API Overview以获得进一步的帮助。
这些功能允许您访问MySQL数据库服务器。有关MySQL的更多信息,请访问»http://www.mysql.com/。
可以在»http://dev.mysql.com/doc/找到MySQL的文档。
您目前的代码向SQL injection开放。使用mysqli_*
功能。 (我建议您使用prepared statements或PDO)
答案 1 :(得分:0)
将所有mysql
更改为mysqli
;
在echo
之后添加分号,为while
答案 2 :(得分:0)
在应该在while循环中执行的语句周围添加花括号。 我还建议你查看mysql_real_escape_string,以避免SQL注入;-) 此外,你必须删除mysqli中的i,因为你使用的是旧的MySQL函数。
$connection = mysql_connect($serverName, $userName, $password) or die('Unable to connect to Database host' . mysql_error());
$dbselect = mysql_select_db($dbname, $connection) or die("Unable to select database:$dbname" . mysql_error());
$studentid = $_POST['student_id'];
$result = mysql_query($connection,"SELECT `first_name` FROM `students` WHERE student_id = '$studentid'");
while($row = mysql_fetch_array($result)){
echo $row['first_name']
}
答案 3 :(得分:0)
好的,这里有很多小问题。
首先 mysql_query()的语法是:
mysql_query(query,connection)
所以连接应该是第二个参数。
在查询字符串中,你必须在你要比较的列周围放置``,如下所示:
WHERE `student_id` = '$studentid'
^here ^and here
mysql_query()和 mysqli_fetch_array()无法协同工作。
mysql_query()与 mysql_fetch_array()
或 mysqli_query()与 mysqli_fetch_array ()强>
此行上有一个缺少的分号:
echo $row['first_name'] // <- here
同时检查 $ _ POST [&#39; student_id&#39;] 中的值是否是您期望的值。
这就是我现在所看到的。
答案 4 :(得分:0)
我发现使用mysqli可以更快地连接并调出结果
$connection = new mysqli($serverName, $userName, $password, $databaseName)
if ($connection->connect_errno) {
printf("Connect failed: %s\n", $mysqli->connect_error);
exit();
}
$studentid = $_POST['student_id'];
$sql = "SELECT `first_name` FROM `students` WHERE student_id = '$studentid'";
$results = $connection->query($sql);
如果您只是检查一名学生,我会抓住一行
if($results->num_rows == 1){
$row = $results->fetch_assoc();
echo $row['first_name'];
}
如果您正试图抓住多个学生ID
while($row = $results->fetch_assoc()){
echo $row['first_name'];
}