что не так с этим кодом

#php #mysql #mamp

#php #mysql #mamp

Вопрос:

 class MyClass {

    private $db;

    // Constructor 
    function __construct() {
        $this->db = new mysqli('localhost', 'root', 'root', 'Test_db');
        $this->db->autocommit(FALSE);
    }

    // Destructor 
    function __destruct() {
        $this->db->close();
    }

    // Main method 
    function MyFun() {

        // Check for required parameters
        if (isset($_POST["name"]) amp;amp; isset($_POST["username"]) amp;amp; isset($_POST["password"]) amp;amp; isset($_POST["email"])) {
        echo "Before n";
        $name = $_POST["name"];
        $username = $_POST["username"];
        $password = $_POST["password"];
        $email = $_POST["email"];
        $activation = 0;
        echo "After n";
            // tracking 
            $stmt = $this->db->prepare("INSERT INTO users (name, username, password, email,activation) VALUES (?, ?, ?, ?, ?)");
            $stmt->bind_param("is", $name, $username, $password, $email, $activation); //Line 95
            $stmt->execute();
            $stmt->close();

        }
  

Вывод:

Перед

После

Неверный запрос

Консоль MAMP:

 [15-Apr-2011 15:09:10] PHP Warning:  mysqli_stmt::bind_param() [<a href='function.mysqli-stmt-bind-param'>function.mysqli-stmt-bind-param</a>]: Number of elements in type definition string doesn't match number of bind variables in /Applications/MAMP/htdocs/Test/reg.php on line 95
  

Номер тот же, но я не знаю, почему появляется эта ошибка

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

1. Number of elements in type definition string doesn't match number of bind variable

2. Вы действительно используете для комментирования // Constructor кострукторы вашего класса?

3. @DaNiel: в чем проблема, да, я КОММЕНТИРУЮ везде в своем коде, кстати, это мой первый код в MYSQL

4. успокойся, приятель, я пошутил! Просто указывать на это // Constructor немного бесполезно без некоторой информации (например, аргументов и некоторой операции, которую он выполняет). Мир и любовь 😉

5. @DaNiel: Добро пожаловать, чувак, всегда Мира и любви. Но, как я уже говорил вам ранее, это мой первый код MYSQL, и я немного сбит с толку.

Ответ №1:

 $stmt->bind_param("is", $name, $username, $password, $email, $activation);
  

Ваша строка «definition» («is») содержит только два определения, integer и string … у вас там должно быть 5.

 $stmt->bind_param("sssss", $name, $username, $password, $email, $activation);
  

… например …

Ответ №2:

В вашем запросе всего пять ? заполнителей, но вы пытаетесь ввести в запрос шесть значений bing. $stmt-> bind_param(«is», $name, $username, $password, $email, $activation);

  1. «есть»
  2. $name
  3. $username
  4. $password
  5. $email
  6. активация $

Формат, который вы предоставляете, содержит только 2 определения, но он должен содержать 5, чтобы соответствовать вашему запросу. Попробуйте "sssss" .

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

1. Нет, он привязывает пять значений. Но в is слишком мало символов формата, так и должно быть issss (или независимо от формата каждого поля)

2. @Pekka, действительно. Скорректировал свой ответ.

Ответ №3:

«is» — это шестая переменная, я предлагаю вам удалить это или добавить имя поля в инструкции:

 $stmt->bind_param("is", $name, $username, $password, $email, $activation);
  

Либо удалить из bind_param:

 $stmt = $this->db->prepare("INSERT INTO users (name, username, password, email,activation) VALUES (?, ?, ?, ?, ?)");
$stmt->bind_param($name, $username, $password, $email, $activation);
  

или добавить в имена полей:

 $stmt = $this->db->prepare("INSERT INTO users (**is**, name, username, password, email,activation) VALUES (?, ?, ?, ?, ?)");
$stmt->bind_param("**is**", $name, $username, $password, $email, $activation);
  

или
$stmt = $this-> db-> prepare(«ВСТАВИТЬ В пользователей (имя, логин, пароль,

электронная почта, активация) ЗНАЧЕНИЯ (?, ?, ?, ?, ?)»);
$stmt-> bind_param(«isssss», $name, $username, $password, $email, $activation);