Hello everyone,
I’ve got a problem with my php code. I keep getting this error 0 1 2 3Connection failed: SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens. As I understand it means that the number of parameters doesn’t match. I rewrited it many times and I’m pretty sure, that everything in this line $sqlQuery = "INSERT INTO users (email, password, firstname, lastname, day, month, year, sex, vkey) VALUES(?,?,?,?,?,?,?,?,?)";
is ok. Any ideas how to fix it?
Class code
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) /*&& $this->sendMail($mail)*/) { echo "4"; return true; } } } } } } ?>
Form code
<?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>
And my mysql table https://imgur.com/a/39LLpbs
Advertisement
Answer
The execute
only accepts array of parameters, but you send the parameters as string.
Change this code:
$query->execute([$var]);
to
$query->execute($var);
And this code:
$var = "$mail, $pwd, $fname, $lname, $day, $month, $year, $sex, $vkey";
to
$var = [ $mail, $pwd, $fname, $lname, $day, $month, $year, $sex, $vkey ];