#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);
- «есть»
- $name
- $username
- $password
- активация $
Формат, который вы предоставляете, содержит только 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);