2015-01-07 2 views
1

Я делаю CRUD с PHP в сетке extjs. Следующий код работает отлично:EXTJS 5 и PHP Создать с помощью подготовленных операторов

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 
    } 
} 

}); 

Спасибо заранее.

EDIT

Спасибо, что ответили.

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

Я думаю, проблема в 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 (= имя базы данных). Данные, предоставляемые в текстовых полях (имя, адрес электронной почты, телефон, состояние).

Любая идея, что может быть неправильным?

EDIT

Следующий код работает, но не совсем то, что я хочу. Кажется, что смесь 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 
    ) 
)); 

ответ

3

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

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

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

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

bind_result предназначен для отображения результатов, но инструкция insert не возвращает никаких результатов. Если вы хотите увидеть, сколько результатов возвращается, используйте $statement->affected_rows или проверьте результат boolean от $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.

EDIT: Чтобы вставить несколько записей в базу данных из массива, вам понадобится использовать такой цикл, как этот код.

$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(); 
} 

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

EDIT 2: Это other StackOverflow post показывает способы вставки нескольких строк с помощью подготовленных операторов

+0

Спасибо за replying.I редактировал свой пост с некоторыми идеями. Прочтите изменения, пожалуйста. Спасибо. – josei

+0

Я обновил ответ, чтобы показать, как вы могли бы вставлять несколько строк из массива. – Scriptable

+0

Спасибо Scriptable. Я также обновил свой пост. Спасибо за помощь. – josei

Смежные вопросы