首页 > 解决方案 > 带有 oop 验证的 SQL 插入

问题描述

我一直在慢慢学习 PHP OOP,我决定是时候开始插入我的表了,但是它似乎没有插入。我将我的代码与工作版本进行了比较,我看不出可能是什么问题,我尝试了一个 var_dump(),查询按预期返回,我通过创建一个新用户测试了我的数据库类,它已成功创建所以我假设不是这样,我测试了 SQL 查询并且它能够插入,我很茫然,因为它现在可能是

形式

<?php 
 session_start(); 
require ("classes/Review.php");
require ("classes/Database.php");

    if ($_SERVER['REQUEST_METHOD'] == 'POST')
    {
        $reviewing = new ReviewValidation();
        $review = $reviewTitle = "";
        $post = filter_input_array(INPUT_POST, FILTER_SANITIZE_STRING);     

        $reviewTitle = $post['reviewTitle'];
        $review =  $post['review'];     
        $errors = array();

        $fields = array(
        'title' => array(        
            'validate' => 'title',
            'message' => 'Title must be at least fife characters',
            'value' => $reviewTitle,
        ),
        'review' => array(         
            'validate' => 'review',
            'message' => 'Your review must be at least three hundred characters',
            'value' => $review,
        )
        );

        foreach($fields as $key => $value) 
        {
            $validation_result = $reviewing->{$value['validate']}($value['value']);
            if(!$validation_result) 
            {
                $errors[] = ['name' => $key, 'error' => $value['message']];
            }
        }

        if(empty($errors))  
        {  
            try
            {
            $db = new Database;
            $success = ["message" => "Review subbbmitted"];     
            $process = $db->prepare('INSERT INTO reviews (reviewTitle)
            VALUES
            (:reviewTitle');
            $process->bindValue(':reviewTitle', $reviewTitle);
            $process->execute();

            }
            catch(Exception $e)
            {
                $errors[] = ['response' => 'fail'];  
            } 
        }
    }

header('Content-Type: application/json');
if (empty($errors))
{
    echo json_encode($success);
}
else
{
    echo json_encode(["errors" => $errors]);
}   

班级

<?php 

class ReviewValidation
{
    private
    $db,
    $review,
    $reviewTitle;

    private static
    $reviewLength = 50,
    $rewviewtitleLength = 5;

    public static function title($reviewTitle)
    {
        return(strlen($reviewTitle) >= self::$rewviewtitleLength);
    }

    public static function review($review)
    {
            return(strlen($review) >= self::$reviewLength);
    }
}

标签: phppdo

解决方案


看起来您可能在插入查询中缺少关闭 ) :

$process = $db->prepare('INSERT INTO reviews (reviewTitle)
        VALUES
        (:reviewTitle)');

如果您在 :reviewTitle 之后添加右括号,则在单引号之前您的语法将是正确的(如上所示)。

我还注意到您对 ReviewValidation 类中的静态方法的调用使用了对象运算符 (->)。要访问静态方法,您需要使用范围解析运算符

因此,您的 $validation_result 行应如下所示:

$validation_result = ReviewValidation::{$value['validate']}($value['value']);

我认为正因为如此,验证可能已经通过,这就是为什么你会遇到没有默认值的问题。


推荐阅读