Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用复选框发布未在表单中工作的邮件_Php_Sql_Class_Oop - Fatal编程技术网

Php 使用复选框发布未在表单中工作的邮件

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(

我在使用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();
    $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行添加到我的函数中。