EXTJS 5 и PHP Create с подготовленными утверждениями

Я делаю CRUD с PHP в сетке extjs.
Следующий код работает нормально:

include("conect.php");

$contacts= $_POST['contacts'];

$data = json_decode($contacts);
$nome = $data->name;
$email = $data->email;
$phone = $data->phone;
$state = $data->state;

$sqlQuery = "INSERT INTO contact (name, email, phone,state) values ('%s', '%s', '%s', '%s')";
$sqlRes = $conn->query($sqlQuery);

echo json_encode(array(
"success" => mysql_errno() == 0,

"contatos" => array(
"id" => mysql_insert_id(),
"name" => $name,
"email" => $email,
"phone" => $phone,
"state" => $state
)
));

Однако я намерен использовать подготовленные заявления.

Я сделал следующую попытку, но безуспешно:

include("conect.php");

$statement = $conn->stmt_init();

$contacts = $_POST['contacts'];

$data = json_decode($contacts);

$name = $data->name;
$email = $data->email;
$phone = $data->phone;
$state = $data->state;$sqlQuery = "INSERT INTO contact (name, email, phone, state, id) values (?, ?, ?, ?, ?)";

$statement = $conn->prepare($sqlQuery);

$statement->bind_param("ssssi", $name_val, $email_val, $phone_val, $state, $id_val);

$statement->execute();

$statement->bind_result($col1, $col2, $col3, $col4, $col5);

while($statement->fetch()){
$output[] = array($col1, $col2, $col3, $col4, $col5);
};$arr = array(
'success' => mysql_errno() == 0,

"contact" => array(
"id" => mysql_insert_id(),
"name" => $name,
"email" => $email,
"phone" => $phone,
"state" => $state
)
);$statement->close();

echo json_encode($output, $arr);

$conn->close();

Что я делаю неправильно?

Магазин extjs:

Ext.define('APP.store.StoreAPP', {
extend: 'Ext.data.Store',

model: 'APP.model.ModelAPP',

pageSize: 25,
autoLoad:true,
autoLoad: {start: 0, limit: 25},
autoSync: false,

proxy: {
type: 'ajax',
api: {
create: 'php/createContact.php',
read: 'php/Contact.php',
update: 'php/updateContact.php',
destroy: 'php/deleteContact.php',
},
reader: {
type: 'json',
//      root: 'contacts', //Extjs 4
rootProperty: 'contacts', //Extjs 5
successProperty: 'success'
},
writer: {
type: 'json',
writeAllFields: true,
encode: true,
//    root: 'contacts', //Extjs 4
rootProperty: 'contacts' //Extjs 5
}
}

});

Заранее спасибо.

РЕДАКТИРОВАТЬ

Спасибо за ответ.

Я прочитал все, что мог найти (интернет, книги) о MySQL и подготовил заявления.
Я не мог найти ответ до сих пор.

Я думаю, что проблема в json_decode и json_encode.

Следующий код, идентичный вашей логике, работает хорошо:

include("conn.php");

$sqlQuery = "SELECT phone FROM contact WHERE name = ? AND email = ? ";

$statement = $conn->prepare($sqlQuery);

$name = "John";
$email = "[email protected]";

$statement->bind_param("s",$name, $email);

$statement->execute();

$statement->bind_result($col1, $col2);while($statement->fetch()){
$output[] = array($col1, $col2);
};

echo json_encode($output);

$statement->close();
$conexao->close();

Я думаю, что проблема в json_decode и json_encode.

«контакты», как вы говорите, это массив, и его extjs хранят конфигурацию rootProperty (= имя базы данных).
Данные предоставляются в виде текстовых полей (имя, адрес электронной почты, телефон, штат).

Есть идеи, что может быть не так?

РЕДАКТИРОВАТЬ

Следующий код работает, но не совсем то, что я хочу.
Кажется, что смесь mysql в json декодирует и кодирует с подготовленными операторами mysqli.

mysqli_errno () не работает в json_encode; просто mysql_errno ().

Если у вас есть другие идеи, я буду благодарен.

Благодарю.

include("conect.php");

$contacts= $_POST['contacts'];

$data = json_decode($contacts);
$name = $data->name;
$email = $data->email;
$phone = $data->phone;
$state = $data->state;

$sqlQuery = "INSERT INTO contact (name, email, phone, state) values (?, ?, ?, ?)";
$statement= $conn->prepare($sqlQuery);
$statement -> bind_param ("ssss", $name_val, $email_val, $phone_val, $state_val);
$statement->execute();

echo json_encode(array(
"success" => mysql_errno() == 0,

"contatos" => array(
"name" => $name,
"email" => $email,
"phone" => $phone,
"state" => $state
)
));

1

Решение

Из того, что я вижу, есть ряд проблем, которые необходимо решить с помощью приведенных выше примеров кода.

Верхний блок кода, который вы ввели, не будет вводить правильную информацию в базу данных. Вы не присваиваете значения, просто «% s». Я просто выполнил ту же самую команду и получил это как строку:

1, %s, %s, %s, %s

Ссылаясь на эту строку: $contacts = $_POST['contacts']; и во множественном числе, я бы предположил, что $contacts будет содержать более одного значения, поэтому переменная будет массивом значений, поэтому такие операторы, как $name = $data->name; не будет работать, вам нужно будет работать с массивом, возможно, с помощью цикла. Не зная предоставляемых данных, трудно сказать.

bind_result используется для отображения результатов, но оператор вставки не возвращает никаких результатов. Если вы хотите увидеть, сколько результатов возвращается $statement->affected_rows или проверьте логический результат $statement->execute для успеха / неудачи.

Код ниже работает для меня:

<?php

$mysqli = new mysqli("localhost", "test_user", "test_pass", "test_db");

if ($mysqli->connect_errno) {
echo "Failed to connect to MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error;
}

$statement = $mysqli->stmt_init();

$data = new stdClass();
$data->name = "Bob";
$data->email = "[email protected]";
$data->phone = "555-5555";
$data->state = "Some State";

// I use auto increment for the ID field.
$sqlQuery = "INSERT INTO contact (`name`, `email`, `phone`, `state`) values (?, ?, ?, ?)";

$statement = $mysqli->prepare($sqlQuery);

$statement->bind_param("ssss", $data->name, $data->email, $data->phone, $data->state);

$statement->execute();

$arr = array(
'success' => mysqli_errno($mysqli) == 0,

"contact" => array(
"id" => mysqli_insert_id($mysqli),
"name" => $data->name,
"email" => $data->email,
"phone" => $data->phone,
"state" => $data->state
)
);

$statement->close();

echo json_encode($arr);

$mysqli->close();

Я хотел бы предложить прочитать на Mysqli Docs.

РЕДАКТИРОВАТЬ: Чтобы вставить несколько записей в базу данных из массива, вам нужно использовать цикл, такой как этот код.

$contacts = json_decode($_POST['contacts']);

foreach ($contacts as $contact) {
// I use auto increment for the ID field.
$sqlQuery = "INSERT INTO contact (`name`, `email`, `phone`, `state`) values (?, ?, ?, ?)";
$statement = $mysqli->prepare($sqlQuery);
$statement->bind_param("ssss", $contact->name, $contact->email, $contact->phone, $contact->state);
$statement->execute();
}

Это должно быть расширено, чтобы включить дополнительную проверку / сообщение об ошибках, но оно должно дать вам рабочий код, который отвечает на ваш вопрос, давая вам хорошую отправную точку. Надеюсь, поможет.

РЕДАКТИРОВАТЬ 2: Это другой пост StackOverflow показывает методы вставки нескольких строк с использованием подготовленных операторов

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]