Javascript-PHP-MySQL的正确方法
我必须在MySQL数据库中插入一些从javascript获取的数据。为了将数据发送到Javascript-PHP-MySQL的正确方法,javascript,php,jquery,mysql,ajax,Javascript,Php,Jquery,Mysql,Ajax,我必须在MySQL数据库中插入一些从javascript获取的数据。为了将数据发送到php脚本,我使用jQuery框架的AJAX、$.POST,以及php的mysqli函数在数据库中插入数据 javascript: $.POST(“insertData.php”{ 名字1:val1, 名字2:val2, ... },函数(数据){ 控制台日志(数据); }); php脚本: 但是使用这种方法,我必须编写列名树次,第一次是用javascript用AJAX发送数据,第二次是用php从$\u P
php脚本
,我使用jQuery框架的AJAX、$.POST
,以及php的mysqli函数在数据库中插入数据
javascript:
$.POST(“insertData.php”{
名字1:val1,
名字2:val2,
...
},函数(数据){
控制台日志(数据);
});
php脚本:
但是使用这种方法,我必须编写列名树次,第一次是用javascript用AJAX发送数据,第二次是用php从$\u POST
检索数据,最后一次是用php进行查询
有没有合适的方法可以从Javascript在MySQL数据库中插入数据,而不应该在其中写入更多次的列名?“从POST检索数据”是没有意义的。只要在代码中需要它的地方使用
$\u POST['name1']
,而不是将它分配给$val1
——这样不必要地复制数据实际上是在浪费内存;) 不管它值多少钱,虽然我不知道你为什么想要它,但你可以这样做:
<?
$columns = array_keys($_POST); //$columns is now array with column names
foreach ($columns as $columns) echo $_POST[$column]; //get value for each column
$columns = join(",",array_keys($_POST)); //$columns is now string name1,name2,...
$values = array_values($_POST); //$values is now array with values
$values = "'".join("','",array_values($_POST))."'"; //$values is now string 'value1','value2','value3',...
?>
<?php
$myvars = array ("name1"="","name2"="")
foreach ($myvars as $key => &$vlaue)
{
if (isset $_POST[$key])
{
$value = $_POST['$key'];
}
}
$mysqli = new mysqli('localhost', 'my_user', 'my_password', 'my_db');
$stmt = $mysqli->prepare('INSERT INTO tableName ('.implode(", ",array_keys(myvars).')) VALUES '.trim(",",str_repeat("?, ", count($myvars)).')');
$stmt->bind_param('ss...', $val1 , $val2 , ...);
$stmt->execute();
$stmt->close();
$mysqli->close();
?>
这只是PHP中的基本数组操作,我不建议使用它来生成查询。因为您永远无法确定在$\u POST
和$\u POST
中会得到什么。在您的示例中,javascript中的数据可以由最终用户操作
然而,我发布这篇文章只是为了展示一些关于您的问题的基本技巧。尽管这是一种不好的做法,但您不必在查询中指定列名。如果您的帖子与列1-1匹配,您可以执行以下操作:
$input = rtrim(str_repeat('?,', count($_POST)), ',');
$stmt = $mysqli->prepare("INSERT INTO tableName VALUES ($input)");
array_shift($_POST, 'ss...');
call_user_func_array(array($stmt, 'bind_param'), $_POST);
您可以创建一个白名单列名数组,允许在插入之前在PHP端进行设置。从中可以明确说明哪些列是可更新/可插入的。现在您有了一个受信任的密钥列表
现在,您可以迭代白名单数组以动态构建SQL INSERT语句,也可以迭代POST数组并从中为白名单中的每个键构建SQL语句。您可以为映射到不同表的不同操作构建不同的白名单,如果运气好,您可以对多个表使用相同的后端逻辑,您可以尝试以下操作:
<?
$columns = array_keys($_POST); //$columns is now array with column names
foreach ($columns as $columns) echo $_POST[$column]; //get value for each column
$columns = join(",",array_keys($_POST)); //$columns is now string name1,name2,...
$values = array_values($_POST); //$values is now array with values
$values = "'".join("','",array_values($_POST))."'"; //$values is now string 'value1','value2','value3',...
?>
<?php
$myvars = array ("name1"="","name2"="")
foreach ($myvars as $key => &$vlaue)
{
if (isset $_POST[$key])
{
$value = $_POST['$key'];
}
}
$mysqli = new mysqli('localhost', 'my_user', 'my_password', 'my_db');
$stmt = $mysqli->prepare('INSERT INTO tableName ('.implode(", ",array_keys(myvars).')) VALUES '.trim(",",str_repeat("?, ", count($myvars)).')');
$stmt->bind_param('ss...', $val1 , $val2 , ...);
$stmt->execute();
$stmt->close();
$mysqli->close();
?>
他问了关于专栏的事names@ferozakbar是的,我提到了这些名称的重复是毫无意义的,但你说的是值,而不是列