【问题标题】:EXTJS 5 and PHP Create with prepared statementsEXTJS 5 和 PHP 使用准备好的语句创建
【发布时间】:2015-01-07 19:33:55
【问题描述】:

我正在 extjs 网格中使用 PHP 进行 CRUD。 以下代码工作正常:

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 和prepared statements 的内容。 到目前为止我找不到答案。

我认为问题出在 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 decode 和 encode 中与 mysqliprepared statements 的混合。

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
    )
));

【问题讨论】:

    标签: php extjs prepared-statement


    【解决方案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 = "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 StackOverflow post 显示了使用准备好的语句插入多行的方法

    【讨论】:

    • 感谢您的回复。我根据一些想法编辑了我的帖子。请阅读更改。谢谢。
    • 我已经更新了答案,以展示如何从数组中插入多行
    • 感谢 Scriptable。我也更新了我的帖子。感谢您的帮助。
    • 欢迎您,我将仔细检查我之前发布的代码,并在需要时进行更新。如果这已经回答了您的问题,您能否将其标记为答案,以便人们知道它已完成。如果不让我知道,我会更新我的答案
    • 感谢 Scriptable 的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-27
    • 1970-01-01
    相关资源
    最近更新 更多