Сбой подключения: SQLSTATE[HY093]: недопустимый номер параметра

#php #sql #pdo

#php #sql #pdo

Вопрос:

Всем привет, у меня проблема с моим php-кодом. Я продолжаю получать эту ошибку 0 1 2 3 Сбой подключения: SQLSTATE [HY093]: недопустимый номер параметра: количество связанных переменных не соответствует количеству токенов. Насколько я понимаю, это означает, что количество параметров не совпадает. Я переписывал его много раз, и я почти уверен, что все в этой строке $sqlQuery = "INSERT INTO users (email, password, firstname, lastname, day, month, year, sex, vkey) VALUES(?,?,?,?,?,?,?,?,?)"; в порядке. Есть идеи, как это исправить?

Код класса

 class Login
{
  public $host = "localhost";
  public $user  = "root";
  public $password = "****";
  public $database = "mydb";
  public $usersTable = "users";
  public $connect_timeout = 15;
  public $dbConnect = false;
  public $conn;
    public function __construct()
    {
        $conn = new PDO("mysql:host=$this->host;dbname=$this->database; connect_timeout=$this->connect_timeout", $this->user, $this->password);
        $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $this->conn = $conn;
    }
  private function getData($sqlQuery, $var)
  {
    try
    {
      $result = $this->conn->prepare($sqlQuery);
      $result->execute([$var]);
      $row = $result->fetchAll(PDO::FETCH_ASSOC);
      return $row;
    }
    catch(PDOException $e)
    {
      echo 'Connection failed: ' . $e->getMessage();
    }
  }
  private function insData($sqlQuery, $var)
  {
    try
    {
      $query = $this->conn->prepare($sqlQuery);
      $query->execute([$var]);
      return true;
    }
    catch(PDOException $e)
    {
      echo 'Connection failed: ' . $e->getMessage();
    }
  }
  public function signup($mail, $pwd, $rpt, $sex, $fname, $lname, $day, $month, $year)
  {
    echo "0";
    if($pwd == $rpt)
    {
      echo "1";
      if($this->validateDate($day, $month, $year))
      {
        $sqlQuery = "SELECT id FROM users WHERE email = ?";
        $var = "$mail";
        echo "2";
        if(empty($this->getData($sqlQuery, $var)))
        {
          $pwd = $this->hashPwd($pwd);
          $vkey = $this->vKey();
          $sqlQuery = "INSERT INTO users (email, password, firstname, lastname, day, month, year, sex, vkey) VALUES(?,?,?,?,?,?,?,?,?)";
          $var = "$mail, $pwd, $fname, $lname, $day, $month, $year, $sex, $vkey";
          echo "3";
          if($this->insData($sqlQuery, $var) /*amp;amp; $this->sendMail($mail)*/)
          {
            echo "4";
            return true;
          }
        }
      }
    }
  }
}

?>
  

Код формы

 <?php
session_start();
if(!empty($_POST["mail"]) || !empty($_POST["pwd"]) || !empty($_POST["rpt"]) || !empty($_POST["sex"]) || !empty($_POST["fname"]) || !empty($_POST["lname"]) || !empty($_POST["day"]) ||
  !empty($_POST["month"]) || !empty($_POST["year"]))
{
  include "includes/main.inc.php";
  $login = new login();
  $login->signup($_POST["mail"], $_POST["pwd"], $_POST["rpt"], $_POST["sex"], $_POST["fname"], $_POST["lname"], $_POST["day"], $_POST["month"], $_POST["year"]);
  //header("Location:index.php");
}
?>
  <main>
    <h1>Signup</h1>
    <form method="post">
      <input type="text" name="mail" placeholder="E-mail"> <br> <br>
      <input type="password" name="pwd"  placeholder="Password"> <br> <br>
      <input type="password" name="rpt" placeholder="Repeat password"> <br> <br>
      <input type="radio" name="sex" id="male" value="1">Male
      <input type="radio" name="sex" id="female" value="2">Female <br> <br>
      <input type="text" name="fname" placeholder="First name"> <br> <br>
      <input type="text" name="lname" placeholder="Last name"> <br> <br>
      <select name="day">
        <option>Day</option>
        <option value="1">1</option>
        <option value="2">2</option>
        <option value="3">3</option>
        <option value="4">4</option>
        <option value="5">5</option>
        <option value="6">6</option>
        <option value="7">7</option>
        <option value="8">8</option>
        <option value="9">9</option>
        <option value="10">10</option>
        <option value="11">11</option>
        <option value="12">12</option>
        <option value="13">13</option>
        <option value="14">14</option>
        <option value="15">15</option>
        <option value="16">16</option>
        <option value="17">17</option>
        <option value="18">18</option>
        <option value="19">19</option>
        <option value="20">20</option>
        <option value="21">21</option>
        <option value="22">22</option>
        <option value="23">23</option>
        <option value="24">24</option>
        <option value="25">25</option>
        <option value="26">26</option>
        <option value="27">27</option>
        <option value="28">28</option>
        <option value="29">29</option>
        <option value="30">30</option>
        <option value="31">31</option>
      </select>
      <select name="month">
        <option>Month</option>
        <option value="1">January</option>
        <option value="2">Febuary</option>
        <option value="3">March</option>
        <option value="4">April</option>
        <option value="5">May</option>
        <option value="6">June</option>
        <option value="7">July</option>
        <option value="8">August</option>
        <option value="9">September</option>
        <option value="10">October</option>
        <option value="11">November</option>
        <option value="12">December</option>
      </select>
      <select name="year">
        <option>Year</option>
        <option value="2020">2020</option>
        <option value="2019">2019</option>
        <option value="2018">2018</option>
        <option value="2017">2017</option>
        <option value="2016">2016</option>
        <option value="2015">2015</option>
        <option value="2014">2014</option>
        <option value="2013">2013</option>
        <option value="2012">2012</option>
        <option value="2011">2011</option>
        <option value="2010">2010</option>
        <option value="2009">2009</option>
        <option value="2008">2008</option>
        <option value="2007">2007</option>
        <option value="2006">2006</option>
        <option value="2005">2005</option>
        <option value="2004">2004</option>
        <option value="2003">2003</option>
        <option value="2002">2002</option>
        <option value="2001">2001</option>
        <option value="2000">2000</option>
        <option value="1999">1999</option>
        <option value="1998">1998</option>
        <option value="1997">1997</option>
        <option value="1996">1996</option>
        <option value="1995">1995</option>
        <option value="1994">1994</option>
        <option value="1993">1993</option>
        <option value="1992">1992</option>
        <option value="1991">1991</option>
        <option value="1990">1990</option>
        <option value="1989">1989</option>
        <option value="1988">1988</option>
        <option value="1987">1987</option>
        <option value="1986">1986</option>
        <option value="1985">1985</option>
        <option value="1984">1984</option>
        <option value="1983">1983</option>
        <option value="1982">1982</option>
        <option value="1981">1981</option>
        <option value="1980">1980</option>
        <option value="1979">1979</option>
        <option value="1978">1978</option>
        <option value="1977">1977</option>
        <option value="1976">1976</option>
        <option value="1975">1975</option>
        <option value="1974">1974</option>
        <option value="1973">1973</option>
        <option value="1972">1972</option>
        <option value="1971">1971</option>
        <option value="1970">1970</option>
        <option value="1969">1969</option>
        <option value="1968">1968</option>
        <option value="1967">1967</option>
        <option value="1966">1966</option>
        <option value="1965">1965</option>
        <option value="1964">1964</option>
        <option value="1963">1963</option>
        <option value="1962">1962</option>
        <option value="1961">1961</option>
        <option value="1960">1960</option>
        <option value="1959">1959</option>
        <option value="1958">1958</option>
        <option value="1957">1957</option>
        <option value="1956">1956</option>
        <option value="1955">1955</option>
        <option value="1954">1954</option>
        <option value="1953">1953</option>
        <option value="1952">1952</option>
        <option value="1951">1951</option>
        <option value="1950">1950</option>
        <option value="1949">1949</option>
        <option value="1948">1948</option>
        <option value="1947">1947</option>
        <option value="1946">1946</option>
        <option value="1945">1945</option>
        <option value="1944">1944</option>
        <option value="1943">1943</option>
        <option value="1942">1942</option>
        <option value="1941">1941</option>
        <option value="1940">1940</option>
        <option value="1939">1939</option>
        <option value="1938">1938</option>
        <option value="1937">1937</option>
        <option value="1936">1936</option>
        <option value="1935">1935</option>
        <option value="1934">1934</option>
        <option value="1933">1933</option>
        <option value="1932">1932</option>
        <option value="1931">1931</option>
        <option value="1930">1930</option>
        <option value="1929">1929</option>
        <option value="1928">1928</option>
        <option value="1927">1927</option>
        <option value="1926">1926</option>
        <option value="1925">1925</option>
        <option value="1924">1924</option>
        <option value="1923">1923</option>
        <option value="1922">1922</option>
        <option value="1921">1921</option>
        <option value="1920">1920</option>
        <option value="1919">1919</option>
        <option value="1918">1918</option>
        <option value="1917">1917</option>
        <option value="1916">1916</option>
        <option value="1915">1915</option>
        <option value="1914">1914</option>
        <option value="1913">1913</option>
        <option value="1912">1912</option>
        <option value="1911">1911</option>
        <option value="1910">1910</option>
      </select>
      <button type="submit" name="signup-submit">Signup</button>
    </form>
  </main>
  

И моя таблица mysql
https://imgur.com/a/39LLpbs

Комментарии:

1. Проверьте, ДЕЙСТВИТЕЛЬНО ли вы передаете все необходимые переменные в функцию, просто повторите их одну за другой. Проблема может заключаться в том, что ваш счетчик в порядке, но переменная не определена.

2. Я думаю $var , что должен быть массив значений, на данный момент он выглядит как одна строка, поэтому $var = [ $mail, $pwd, $fname, ... ]

3. @NigelRen попал в точку! Но я думал, что он использует какой-то класс, как я, где я передаю переменные через запятую, если нет, то да, PHP может просматривать его как одну переменную.

4. Спасибо всем, ребята, @NigelRen прав. Я думал, что могу сделать это в своей функции $query->execute([$var]);

5. @Undry if (!is_array($var)) { $var = array_map('trim', explode(',', $var)); }

Ответ №1:

Принимает execute только массив параметров, но вы отправляете параметры в виде строки.

Измените этот код:

 $query->execute([$var]);
  

Для

 $query->execute($var);
  

И этот код:

 $var = "$mail, $pwd, $fname, $lname, $day, $month, $year, $sex, $vkey";
  

Для

 $var = [
    $mail,
    $pwd,
    $fname,
    $lname,
    $day,
    $month,
    $year,
    $sex,
    $vkey
];