Php 使用复选框发布未在表单中工作的邮件
我在使用OOP CRUD方法时遇到了一些问题。我的POST方法不是检索数据或将数据发布到DB。我不知道该去哪里看,因为它不会显示任何错误 表格上方的逻辑:Php 使用复选框发布未在表单中工作的邮件,php,sql,class,oop,Php,Sql,Class,Oop,我在使用OOP CRUD方法时遇到了一些问题。我的POST方法不是检索数据或将数据发布到DB。我不知道该去哪里看,因为它不会显示任何错误 表格上方的逻辑: $id = $_GET['id']; //Add Board $b = new Board(); $userID = $_SESSION['id']; $boards= $b->loadBoards($userID); if(isset($_POST['addBoard'])){ try{ $sB = new Board(
$id = $_GET['id'];
//Add Board
$b = new Board();
$userID = $_SESSION['id'];
$boards= $b->loadBoards($userID);
if(isset($_POST['addBoard'])){
try{
$sB = new Board();
$postID = 61;
$boardID = 1;
$sBoard = $sB->savePostToBoard($postID, $boardID);
} catch (Exception $e) {
$error = $e->getMessage();
}
}
表格如下:
<form method="post">
<div class="btn-group" data-toggle="buttons">
<?php foreach($boards as $key) : ?>
<label class="btn btn-primary active">
<input type="radio" name="option[]"value="
<?php echo $key['boardID'];?>">
<?php echo $key['boardTitle']; ?></label>
<?php endforeach ?>
<input class="btn btn-danger"type="submit" value="Toevoegen"
id="addBoard" name="addBoard">
</div>
</form>
非常感谢您的反馈,感谢您抽出时间。
问候
您真的应该在PDO实例化中使用这些:
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
那么您就会在查询中看到语法错误:由于某些原因,您有
值(:postID;)
(注意分号)
此外,您实际上没有在任何时候将$boardID
传递给savePostToBoard()
方法。您应该在该方法中添加第二个参数
至于您的一般应用程序结构,您确实应该避免使用单例来共享数据库连接,并且应该将域逻辑与持久性逻辑分开。阅读可能对您有益。*)您的所有单选按钮都具有相同的id属性。它应该是独一无二的。
*)将id“addBoard”提供给submit按钮。
*)你为什么使用POST和GET
$boardID = $_POST['option'];
$postID = $_GET['id'];
*)您错过了$sign-in语句->bindValue(“:boardID”,boardID)代码>!
*)发布的数据类型应与数据库数据类型相对应。使用bindValue()
中的第三个参数定义相应的数据类型。并使用一个函数:
public function getConnection() {
$conn = Db::getInstance();
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$conn->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
return $conn;
}
private function getInputParameterDataType($value) {
$dataType = PDO::PARAM_STR;
if (is_int($value)) {
$dataType = PDO::PARAM_INT;
} elseif (is_bool($value)) {
$dataType = PDO::PARAM_BOOL;
}
return $dataType;
}
public function savePostToBoard($postID, $boardID)
{
$sql ="UPDATE board SET postID=:". $postID . " WHERE boardID=:boardID";
$statement = $this->getConnection()->prepare($sql);
$statement->bindValue(":boardID",$boardID, $this-
>getInputParameterDataType($boardID));
$statement->bindValue(":postID", $postid);
return $statement->execute();
}
private function getInputParameterDataType($value) {
$dataType = PDO::PARAM_STR;
if (is_int($value)) {
$dataType = PDO::PARAM_INT;
} elseif (is_bool($value)) {
$dataType = PDO::PARAM_BOOL;
}
return $dataType;
}
然后像这样打电话:
$statement->bindValue(":boardID",$boardID, $this->getInputParameterDataType($boardID));
$board = new Board($boardID);
$boardUpdated = $board->update($postID);
*)PDO::prepare()可以引发PDO异常或值FALSE。所以你应该处理这两种情况。我写了一个关于这一点的答案:对于prepare()和execute()的异常处理
*)到目前为止,你做了一些改变吗?一切正常,还是还没有
好的,我现在就学习
新代码的解决方案:
*)不要在sql语句末尾使用分号“;”。
*)更新应包含以下表格:
UPDATE [table-name] SET [col1]=:[col1],[col2]=:[col2] WHERE [PK-name]=:[PK-name]
*)可读性:在变量中传递sql语句,并使用点来分隔其中使用的变量。比如:
$sql = "UPDATE board SET postID=:" . $postid . " WHERE boardID=:boardID"
$statement = $conn->prepare($sql);
*)正如@teresko提醒您的那样:您没有将$boardID
传递给savePostToBoard()
:
*)整体使用$postID
或$postID
。现在您正在使用这两种形式。做出选择
现在应该可以了。让我知道
一些建议:
*)让你的方法只做一件事(如果可能的话)。在您的问题中,连接创建不属于该方法。如果调用20个需要连接的方法,则必须在每个方法中编写相同的连接创建代码。在您的情况下,最好在Board
类中定义getConnection()
方法
public function getConnection() {
$conn = Db::getInstance();
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$conn->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
return $conn;
}
现在,通过调用它,您的savePostOnBoard()
中只有这个:
public function savePostToBoard($postID) {
$statement = $this->getConnection()->prepare(...);
//...
}
*)通常,最好使用构造函数来传递方法稍后使用的变量。这就是构造函数的角色:初始化,例如在创建时为对象属性提供初始值。例如:
class Auto {
private $color;
private $doors;
private $airConditioning;
public __function __construct($color = 'blue', $doors = 3, $airConditioning = true) {
$this->color = $color;
$this->doors = $doors;
$this->airConditioning = $airConditioning;
}
}
$myAuto = new Auto('red', 4, false);
$hisAuto = new Auto('yellow', 8, true);
哦,始终为变量、函数、类等提供易于遵循的名称。在您的情况下,上面的短语和下面的短语适用,例如:
$statement->bindValue(":boardID",$boardID, $this->getInputParameterDataType($boardID));
$board = new Board($boardID);
$boardUpdated = $board->update($postID);
看到了吗?更好的名字,更符合逻辑(按照我们现实世界的感知)的论点安排
*)我还建议您在方法中拆分代码。通过这种方式,您可以实现更好的代码片段重用性和优雅、易于遵循的结构。可能类似于您的代码:
public function savePostToBoard($postID, $boardID) {
$sql = "UPDATE board SET postID=:" . $postID . " WHERE boardID=:boardID";
$bindings = array(
':postID' => $postID,
':boardID' => $boardID
);
$statement = $this->execute($sql, $bindings);
return $statement->rowCount();
}
protected function execute($sql, array $bindings = array()) {
$statement = $this->prepareStatement($sql);
$this->bindInputParameters($statement, $bindings);
$this->executePreparedStatement($statement);
return $statement;
}
private function prepareStatement($sql) {
$statement = $this->getConnection()->prepare($sql);
return $statement;
}
private function bindInputParameters($statement, $bindings) {
foreach ($bindings as $key => $value) {
$statement->bindValue(
$this->getInputParameterName($key)
, $value
, $this->getInputParameterDataType($value)
);
}
return $this;
}
private function getInputParameterName($key) {
if (is_int($key)) {
return $key + 1;
}
$trimmed = ltrim($key, ':');
return ':' . $trimmed;
}
private function getInputParameterDataType($value) {
$dataType = PDO::PARAM_STR;
if (is_int($value)) {
$dataType = PDO::PARAM_INT;
} elseif (is_bool($value)) {
$dataType = PDO::PARAM_BOOL;
}
return $dataType;
}
private function executePreparedStatement($statement) {
$statement->execute();
return $this;
}
祝你的项目好运 name=“option”
需要更改为name=“option[]”“
INSERT没有WHERE、UPDATE或INSERT-on-duplicate。没有人注意到这一点^。请学习使用。我做了如上所述的更改。我使用$_GET['id']将url(detail.php?id=62)中的值绑定到我不太理解的postID(它们是相同的)。您使用method=“post”
提交表单,对吗?当您提交它时,您还读取一个GET值,例如地址栏中您的url的“id”?您还有一个$\u会话['id']
。这是正确的,先生,这实际上是一个学校项目以及与其他学生的合作,变量$id似乎包含$\u GET['id'],并且已经在我的代码上面声明了。我想我可以使用变量$id,而不是将其重新声明为$postID。至于$_会话['id'],它包含链接该用户内容的用户id。好的,谢谢您的解释。我真的不能评论,所以我会在我的答案中进一步修改它。谢谢你对我的项目的广泛看法!我已经做了一些更改并更新了代码,但它仍然没有做任何事情。我已经添加了一些来自表格和前端的屏幕截图,让您可以更清晰地看到。谢谢您的回复,我会看看您给我的文档。我将这些setAttribute行添加到我的函数中。