【问题标题】:Uncaught ArgumentCountError: Too few arguments to function未捕获的 ArgumentCountError:函数参数太少
【发布时间】:2019-06-01 13:47:06
【问题描述】:

我想使用 PDO 和 PHP 将具有 $_POST 方法的数据保存到数据库中。我写了代码,但它给了我一个错误。有没有人能解决这个问题?

macex.php

function daireekle($daire_no,$dpass,$daire_statu,$daire_adi,$daire_soyadi){
    $sql ="insert into users (KULLANICIADI,SIFRE,TIPI,ADI,SOYADI) values ('$daire_no','$dpass','$daire_statu','$daire_adi','$daire_soyadi')";
    $insert =$this->connection->query($sql);
}

块.html

<?php
$sinif = new macex();
if ($_POST) {
    $daire_no = $_POST['daireno'];
    $daire_adi = $_POST['daireadi'];
    $daire_soyadi = $_POST['dairesoyadi'];
    $daire_statu = $_POST['statu'];
    $dpass = $_POST['dpass'];
    $sinif->daireekle('users', ['KULLANICIADI', 'SIFRE', 'TIPI', 'ADI', 'SOYADI'], [$daire_no, $dpass, $daire_statu, $daire_adi, $daire_soyadi]);
}
?>

【问题讨论】:

  • 所以,首先,要明确的是,daireekle() 是一个类的方法,对吧?其次,您的函数接受 5 个参数,而您只发送 3 个:'users', array, array。在提供的代码中,您不接受“用户”和第一个数组。您只接受第二个数组的值。
  • 要么更改函数daireekle(),要么更改对它的调用。您现在调用它的方式可能对将来的使用更加灵活,BUT 无论如何它都对 sql 注入开放。所以宁愿改变那个函数来使用准备好的语句。
  • 警告:您对SQL Injections 持开放态度,应该真正使用参数化Prepared Statements,而不是像那样手动构建查询。特别是因为您根本没有逃避用户输入!

标签: php class pdo


【解决方案1】:

就结构而言,您的代码有点难以理解,但您通过注入未经处理的POST 数据肯定是在滥用PDO

如果我要尝试将您的样本转换为可行的东西,我会建议进行以下修改:

注意:假设 $this-&gt;connection-&gt; 是您的 PDO 对象)

Blok.html (不知道你为什么将这个 PHP 文件称为Blok.html

<?php
$sinif = new macex();
if ($_POST) {
    $sinif->daireekle( $_POST );
}
?>

macex.php

function daireekle( $postArray ){

// Parameterised PDO will mostly prevent SQL Injection, but it's still best practice 
// to validate and sanitize your inputs, especially if they are coming from the user
$daire_no = $postArray ['daireno'];
$daire_adi = $postArray ['daireadi'];
$daire_soyadi = $postArray ['dairesoyadi'];
$daire_statu = $postArray ['statu'];
$dpass = $postArray ['dpass'];

// Define the query with positional params
$sql = 'INSERT INTO users (KULLANICIADI, SIFRE, TIPI, ADI, SOYADI) VALUES (?,?,?,?,?)';

// Create an array of your params in the order they apply to the query
$paramsArray = array('$daire_no','$dpass','$daire_statu','$daire_adi','$daire_soyadi');

// Prepare the parameterised query
$query = $this->connection->prepare($sql);

// Execute the INSERT query with the parameters
$query->execute($paramsArray);

}

您当然可以在上面使用不同的变体,包括命名参数,但按照上面的解释更简洁。

【讨论】:

    猜你喜欢
    • 2018-10-11
    • 2018-06-26
    • 1970-01-01
    • 1970-01-01
    • 2022-01-07
    • 2018-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多