Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.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
Php Drupal删除/更新数据库中的错误行_Php_Mysql_Forms_Drupal_Drupal 7 - Fatal编程技术网

Php Drupal删除/更新数据库中的错误行

Php Drupal删除/更新数据库中的错误行,php,mysql,forms,drupal,drupal-7,Php,Mysql,Forms,Drupal,Drupal 7,我有一组可以用表单编辑和删除的项目。现在,所有ITM都以字段集的形式显示在列表中。使用以下方法创建字段集: $venues = db_query('SELECT vid, name, address, postcode, city FROM venues v WHERE v.uid = :uid', array(':uid' => $user->uid)); if($venues->rowCount() != 0) { foreach($venues as $venu

我有一组可以用表单编辑和删除的项目。现在,所有ITM都以字段集的形式显示在列表中。使用以下方法创建字段集:

 $venues = db_query('SELECT vid, name, address, postcode, city FROM venues v WHERE v.uid = :uid', array(':uid' => $user->uid));
 if($venues->rowCount() != 0) {
   foreach($venues as $venue) {
     $page['venue_editing_form'][] = drupal_get_form('venue_editor_form', $venue->vid, $venue->name, $venue->address, $venue->postcode, $venue->city); 
   }
 }
然后使用此函数创建表单:

function venue_editor_form($form, &$form_state, $vid, $vname, $vadd, $vpostc, $vcity) {
$form['#prefix'] = '<div class="vedit">';
$form['#suffix'] = '</div>';
$form['edit_fieldset_'.$vname] = array(
  '#type' => 'fieldset',
  '#title' => t($vname),
  '#collapsible' => TRUE,
  '#collapsed' => TRUE,
  '#attributes' => array('class' => array('venue-edit')),
);
$form['edit_fieldset_'.$vname]['venue_name'] = array(
  '#type' => 'textfield',
  '#title' => t('Venue name:'),
  '#description' => t('Enter the venue name.'),
  '#default_value' => $vname,
  '#attributes' => array('onfocus' => 'this.value=""')
);
$form['edit_fieldset_'.$vname]['address'] = array(
  '#type' => 'textfield',
  '#title' => t('Address:'),
  '#description' => t('The address of this venue.'),
  '#default_value' => $vadd,
  '#attributes' => array('onfocus' => 'this.value=""')
);
$form['edit_fieldset_'.$vname]['postcode'] = array(
  '#type' => 'textfield',
  '#title' => t('Postcode'),
  '#description' => t('Enter the postcode for this event, so planB can position it on the map'),
  '#default_value' => $vpostc,
  '#attributes' => array('onfocus' => 'this.value=""', 'onblur' => 'getLatLong(this)')
);
$form['edit_fieldset_'.$vname]['city'] = array(
  '#type' => 'textfield',
  '#title' => t('City'),
  '#description' => t('The city this venue is in.'),
  '#default_value' => $vcity,
  '#attributes' => array('onfocus' => 'this.value=""')
);
$form['edit_fieldset_'.$vname]['edit_submit'] = array(
  '#type' => 'submit',
  '#value' => t('Submit changes'),
  '#validate' => array('venue_creation_form_validate')
);
$form['edit_fieldset_'.$vname]['delete_venue'] = array(
  '#type' => 'submit',
  '#value' => t('Delete venue'),
  '#submit' => array('venue_form_delete')
);
$form['edit_fieldset_'.$vname]['venueid'] = array(
  '#type' => 'value',
  '#value' => $vid
);
return $form;
现在的问题是,无论我按下哪个场馆的删除按钮,Drupal都会删除列表中的第一个
$form['#venueid']
始终设置为提交处理程序列表中的第一个地点,但由于某些原因,如果在生成表单时打印消息,则每个表单都有一个不同的ID,这是应该的


以前有人遇到过这个问题吗?

我想问题是您试图通过表单处理传递venueid值,而不使用显式值字段:

$form['#venueid'] = $vid;
这只是将一个值赋给“组合”表单属性(前导“#”),该属性通常不存在。请尝试改用显式表达式:

这样,vid应该像任何其他表单值一样在提交函数中可用,即在
$form_state['values']
中:

function venue_form_delete($form, &$form_state) {
  $deleted = db_delete('venues')
    ->condition('vid', $form_state['values']['venueid'], '=')
    ->execute();
    drupal_set_message('Venue deleted successfully.');
}

请注意,删除“#”字符-前导“#”表示表单(和表单元素)属性,Drupal将在表单处理过程中尝试解释这些属性,“#venueid”不是一个已定义的属性。

我想问题在于,您试图在表单处理过程中传递venueid值,而不使用显式值字段:

$form['#venueid'] = $vid;
这只是将一个值赋给“组合”表单属性(前导“#”),该属性通常不存在。请尝试改用显式表达式:

这样,vid应该像任何其他表单值一样在提交函数中可用,即在
$form_state['values']
中:

function venue_form_delete($form, &$form_state) {
  $deleted = db_delete('venues')
    ->condition('vid', $form_state['values']['venueid'], '=')
    ->execute();
    drupal_set_message('Venue deleted successfully.');
}

请注意,删除“#”字符—前导的“#”表示表单(和表单元素)属性,Drupal将在表单处理过程中尝试解释这些属性,“#venueid”不是一个定义的属性。

我的一位同事几周前遇到了这个问题。出现此问题的原因是,您试图在一个页面上多次加载具有不同数据的同一表单。看起来这应该是可行的,但事实并非如此,因为所有表单最终都具有相同的令牌/ID。当您提交每个表单时,系统不知道您真正单击了哪个表单,因此无法采取适当的操作

有两种方法可以解决此问题:

1) 修改表单,使其全部由一个表单而不是多个表单处理

2) 用于创建“基本表单”,然后为映射到“基本表单”的每个场馆生成唯一表单。这将确保每个表单获得唯一的ID,而不必为每个表单编写表单

我没有一个Drupal7的例子,但这里有一个页面展示了如何使用hook_表单解决Drupal6的问题。您应该能够应用相同的技术

我还没有测试过这段代码,但这是基本思想:

修改get_表单以使用唯一id

foreach($venues as $venue) {
     $page['venue_editing_form'][] = drupal_get_form('venue_editor_form_'. $venue->vid, $venue->vid, $venue->name, $venue->address, $venue->postcode, $venue->city); 
   }
执行钩形图

function MODULENAME_forms($form_id) {
  $forms = array();
  if (preg_match('/venue_editor_form_/', $form_id) {
    $forms[$form_id] = array(
      'callback' => 'venue_editor_form',
    );
  }
  return $forms;
}
然后我认为您必须修改表单的submit参数,以确保它们都被路由到同一个提交处理程序。尽管看起来每个按钮都添加了不同的提交,所以您可能不需要在那里做任何事情

$form['#submit'] => array('venue_editing_form_submit');
您可能还必须对validate函数执行相同的操作


应该这样做

我的一位同事几周前遇到了这件事。出现此问题的原因是,您试图在一个页面上多次加载具有不同数据的同一表单。看起来这应该是可行的,但事实并非如此,因为所有表单最终都具有相同的令牌/ID。当您提交每个表单时,系统不知道您真正单击了哪个表单,因此无法采取适当的操作

有两种方法可以解决此问题:

1) 修改表单,使其全部由一个表单而不是多个表单处理

2) 用于创建“基本表单”,然后为映射到“基本表单”的每个场馆生成唯一表单。这将确保每个表单获得唯一的ID,而不必为每个表单编写表单

我没有一个Drupal7的例子,但这里有一个页面展示了如何使用hook_表单解决Drupal6的问题。您应该能够应用相同的技术

我还没有测试过这段代码,但这是基本思想:

修改get_表单以使用唯一id

foreach($venues as $venue) {
     $page['venue_editing_form'][] = drupal_get_form('venue_editor_form_'. $venue->vid, $venue->vid, $venue->name, $venue->address, $venue->postcode, $venue->city); 
   }
执行钩形图

function MODULENAME_forms($form_id) {
  $forms = array();
  if (preg_match('/venue_editor_form_/', $form_id) {
    $forms[$form_id] = array(
      'callback' => 'venue_editor_form',
    );
  }
  return $forms;
}
然后我认为您必须修改表单的submit参数,以确保它们都被路由到同一个提交处理程序。尽管看起来每个按钮都添加了不同的提交,所以您可能不需要在那里做任何事情

$form['#submit'] => array('venue_editing_form_submit');
您可能还必须对validate函数执行相同的操作


应该这样做

维德是从哪里来的?你是说nid吗?vid是场馆id,它来自数据库查询,以获取所有场馆的详细信息。然后,我使用foreach循环遍历所有结果,drupal_get_form('venture_editor_form',$venture->vid…)重新阅读问题,是否您有一个表单,具有多个字段集和多个提交/删除按钮(即每个场馆一个字段集)?有多个具有多个删除/更新按钮的字段集,但每个字段集有一个表单。表单是通过从数据库中获取场地并在foreach循环中调用drupal\u get\u form来创建的。vid来自哪里?你是说nid吗?vid是场馆id,它来自数据库查询,以获取所有场馆的详细信息。然后,我使用foreach循环遍历所有结果,drupal_get_form('venture_editor_form',$venture->vid…)重新阅读问题,是否您有一个表单,具有多个字段集和多个提交/删除按钮(即每个场馆一个字段集)?有多个具有多个删除/更新按钮的字段集,但每个字段集有一个表单。表单是通过从数据库中获取场地并在foreach循环调用中创建的