【问题标题】:Can't get query to work in php CRUD system for checking duplicates无法在 php CRUD 系统中进行查询以检查重复项
【发布时间】:2017-12-14 12:45:50
【问题描述】:

我有一个 CRUD 系统,并为其中三个字段创建了验证,以确保它们不为空,这样可以完美运行。我想通过确保 ID 不存在来添加进一步验证。

这里是代码..

$required = array('id', 'name', 'family');

$noDouble = true;

$mysqli = new mysqli("localhost", "username", "password", "database");

/* check connection */
if ($mysqli->connect_errno) {
    printf("Connect failed: %s\n", $mysqli->connect_error);
    exit();
}else{echo "connected";}

$query1 = mysqli_query($mysqli, "SELECT * FROM products WHERE id=='" . $product->id ."'");




if (!$query1){
	$noDouble = false;
	
}

$error = false;
foreach($required as $field) {
	if (empty($_POST[$field])){
		$error = true;
	}
}




if($_POST && $error) {
	
	echo "<div class='alert alert-danger'>All fields required</div>";
	
}elseif($_POST && $noDouble) {
	
	echo "<div class='alert alert-danger'>That part number already exists</div>";
	
}

// if the form was submitted 
elseif ($_POST){
 
    // set product property values
	$product->id = $_POST['id'];
    $product->name = $_POST['name'];
	$product->family = $_POST['family'];
    //$product->number = $_POST['number'];
	$product->description = $_POST['description'];
    $product->ext_description = $_POST['ext_description'];
	$product->PRF = $_POST['PRF'];
	
	if(isset($_POST['publish'])){
    //$stok is checked and value = 1
    $published = $_POST['publish'];
	$product->publish = $_POST['publish'];
	}
	else{
		//$publish is not checked and value=0
		$published = 0;
		$product->publish = 0;
	}
	//$product->publish = $_POST['publish'];
/*  $product->category_id = $_POST['category_id'];  */
 
    // create the product
    if($product->create()){
        echo "<div class='alert alert-success'>Product was created.</div>";
    }
	
	
}

但是,查询的 if 语句似乎不起作用,因为它继续告诉我部件号存在。我的查询有问题吗?我也尝试用$_POST['id'] 替换$product-&gt;id,但这会导致更多错误。任何帮助将不胜感激。

【问题讨论】:

    标签: php mysql forms validation


    【解决方案1】:

    好吧,按照说法,查询本身没有任何问题。但是,您的逻辑在两个方面存在问题。

    $query1 = "SELECT * FROM products WHERE id=='" . $product->id ."'";
    
    1. 这很容易受到SQL Injection 的攻击。这很糟糕,你需要解决这个问题。这样的漏洞不仅对您的应用程序的安全性造成威胁,而且可能对您的整个系统造成威胁。使用PDOmysqli 绑定您的参数。

    2. 您实际上并没有对您编写的查询执行任何操作。要实际查询它,您需要执行它。

    3. id 后面只能有一个等号。

    此时,我建议你看看PDO tutorial。完全修复您的代码有点超出 SO 答案的范围。

    【讨论】:

    • 我不是在尝试执行查询,如果产品 ID 不存在,我只想将其设为 false (0) 而不是 true。你还有什么建议吗?附言。经历了许多 PDO 教程,但认为这将是一个简单的修复。不用担心注射,因为这是本地应用程序。谢谢你的时间!
    • 您需要执行查询(也就是将其提交到数据库)以获得结果。您所做的就是创建一个字符串。你没有接触过数据库,因此没有得到结果。
    • 附带说明,如果 id 列是数值,则不需要将其括在引号中。没有原始代码的一部分,这只是浪费精力。
    • 虽然@Jacobm001 是完全正确的,但我想建议一个速记解决方案来解决这里的重大安全漏洞:"SELECT * FROM products WHERE id = ". (int)$product-&gt;id 。请注意单个 = 和缺少引号以及将值强制为 integer
    • @DesignStuff 您不能在同一连接上使用 OOP 和 Procedural MySQLi。 one of many references
    猜你喜欢
    • 2011-07-13
    • 2022-11-23
    • 1970-01-01
    • 2018-09-10
    • 1970-01-01
    • 2014-01-31
    • 1970-01-01
    • 2015-03-02
    • 2018-04-10
    相关资源
    最近更新 更多