1 回答

TA贡献1942条经验 获得超3个赞
您的问题不清楚,因为您未能隔离您的代码究竟在哪里失败,并且没有告诉我们您收到了什么错误。(直到改变,我不能赞成你的问题)
不过,您的问题很清楚预期的效果。我编写了一个未经测试的脚本,我认为它应该可以按要求工作。
<?php
$config = ['localhost', 'root', '', 'dbname'];
if (!$con = new mysqli(...$config)) {
die("MySQL Connection Error: <b>Check config values</b>"); // $con->connect_error
}
$query = "SELECT cat.CategoryName, cat.id,
writ.Writter, writ.writterdescription,
writ.PostingDate, writ.UpdationDate, writ.WritterId
FROM tblwritter AS writ
JOIN tblcategory AS cat ON writ.CategoryId = cat.id
WHERE writ.Is_Active = 1
AND writ.WritterId = ?"
if (!$stmt = $con->prepare($query)) {
echo "Prepare Error: "; // $con->error
} elseif (!$stmt->bind_param("i", $_GET['scid']) ||
!$stmt->execute() ||
!$stmt->bind_result($catname,
$catid,
$writtername,
$writterdescription,
$writterpostingdate,
$writterupdationdate,
$writterid)) {
echo "Statement Error: "; // $stmt->error
} elseif (!$stmt->fetch()) {
echo "[No qualifying row found]";
}
$stmt->close();
$catid = $catid ?? 0;
$query = "SELECT id, CategoryName
FROM tblcategory
WHERE Is_Active = 1
AND id != ?";
if (!$stmt = $con->prepare($query)) {
echo "Prepare Error: "; // $con->error
} elseif (!$stmt->bind_param("i", $catid) ||
!$stmt->execute() ||
!$stmt->bind_result($id, $name)) {
echo "Statement Error: "; // $stmt->error
} else { ?>
<div class="form-group">
<label class="col-md-2 control-label">Category</label>
<div class="col-md-10">
<select class="form-control" name="category" required>
<?php
if ($catid) {
echo '<option value=' , $catid , '>' , htmlentities($catname) , '</option>';
}
while ($stmt->fetch()) {
echo '<option value=' , $id , '>' , htmlentities($name) , '</option>';
}
?>
</select>
</div>
</div> <?php
}
维护面向对象的 mysqli 语法而不是混合语法。OO 是我的推荐,因为它比程序更简洁。
我已经标记了我的代码段,使其全部适合 Stack Overflow 代码段框,而无需水平滚动。
在查询中写入 MySQL 关键字时使用全部大写 - 这将提高可读性。
使用短表别名(如“cat”和“writ”,这样您的查询就不会因字符而变得臃肿
我在流程中包含了一堆检查点,以帮助您诊断可能出现的任何问题。永远不要向最终用户显示原始错误消息——出于安全考虑。
我没有检查是否
$_GET['scid']
存在,我假设您在其他地方这样做。如果由于某种原因提交的 scid 值不返回任何符合条件的行,则将其默认为零。这将允许下一个查询一致地工作。我更改了您的第二个查询,以便它不会在选择字段中再次提供 scid 值。
如果在数据库中找到 $catid,它将在选择字段中显示为第一个选项。
只要数据库列是 INT 数据类型(它应该是),就
value
不需要在选项标签中作为属性写入的整数值htmlentities()
。我还删除了整数上的双引号,因为它们不是必需的。
- 1 回答
- 0 关注
- 168 浏览
添加回答
举报