EXTJS 5 和 PHP 使用准备好的语句创建
EXTJS 5 and PHP Create with prepared statements
我正在 extjs 网格中使用 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
}
}
});
提前致谢。
编辑
感谢您的回复。
我已经阅读了我能找到的关于 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@email.com";
$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。
'contacts' 就像你说它是一个数组,它的 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
)
));
据我所知,上述代码示例中有许多问题需要解决。
您输入的最上面的代码块不会将正确的信息输入数据库,您没有分配值,只是“%s”。我只是 运行 完全相同的命令并将其作为行:
1, %s, %s, %s, %s
参考这一行:$contacts = $_POST['contacts'];
和复数命名,我认为 $contacts
将包含多个值,因此变量将是一组值,因此语句如$name = $data->name;
将不起作用,您需要使用数组,也许使用循环。不知道所提供的数据很难说。
bind_result 用于显示结果,但插入语句不会 return 任何结果。如果您想查看有多少结果被 returned 使用 $statement->affected_rows
或检查 $statement->execute
的布尔结果 success/fail.
下面的代码对我有用:
<?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 = "bob@example.com";
$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:此 other Whosebug post 展示了使用准备好的语句插入多行的方法
我正在 extjs 网格中使用 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
}
}
});
提前致谢。
编辑
感谢您的回复。
我已经阅读了我能找到的关于 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@email.com";
$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。
'contacts' 就像你说它是一个数组,它的 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
)
));
据我所知,上述代码示例中有许多问题需要解决。
您输入的最上面的代码块不会将正确的信息输入数据库,您没有分配值,只是“%s”。我只是 运行 完全相同的命令并将其作为行:
1, %s, %s, %s, %s
参考这一行:$contacts = $_POST['contacts'];
和复数命名,我认为 $contacts
将包含多个值,因此变量将是一组值,因此语句如$name = $data->name;
将不起作用,您需要使用数组,也许使用循环。不知道所提供的数据很难说。
bind_result 用于显示结果,但插入语句不会 return 任何结果。如果您想查看有多少结果被 returned 使用 $statement->affected_rows
或检查 $statement->execute
的布尔结果 success/fail.
下面的代码对我有用:
<?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 = "bob@example.com";
$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:此 other Whosebug post 展示了使用准备好的语句插入多行的方法