Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript-PHP-MySQL的正确方法_Javascript_Php_Jquery_Mysql_Ajax - Fatal编程技术网

Javascript-PHP-MySQL的正确方法

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

我必须在MySQL数据库中插入一些从javascript获取的数据。为了将数据发送到
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是的,我提到了这些名称的重复是毫无意义的,但你说的是值,而不是列