Обновление таблиц MySQL / PHP — вставка имени переменной вместо значений

#php #mysql #forms

#php #mysql #формы

Вопрос:

я слишком много искал об этом, но я даже не новичок в написании сценариев PHP… итак, мне нужна помощь.

я разрабатываю самодельную систему домашней автоматизации, основанную на PHP / MySQL, и мне нужен серверный сервер для обновления таблиц базы данных и обеспечения того, чтобы все действительно происходило в реальном времени.

итак, я нашел нужный мне код, и, после некоторой адаптации, вот он.

 <?php
$username = "root";
$password = "";
$hostname = "localhost"; 
$database = "domonet";
$tabela = "AtuadorAnalogico";
$valor1 = "AA_id";
$valor2 = "AA_nome";
$valor3 = "AA_valor";

//connection to the database

$dbhandle = mysql_connect($hostname, $username, $password) 
  or die("Unable to connect to MySQL");
echo "Connected to MySQL<br>";


//select a database to work with

$selected = mysql_select_db($database,$dbhandle) 
  or die("Could not select examples");
  echo "Connected ao banco<br>";

//get data from db

$sql = mysql_query("SELECT * FROM $tabela");
$count=mysql_num_rows($sql);

//start a table

echo '<form name="form1" method="post" action="">
<table width="292" border="0" cellspacing="1" cellpadding="0">';

//start header of table

echo '<tr>
<th>amp;nbsp;</th>
<th>Name</th>
<th>Email</th>
</tr>';

//loop through all results

while($r=mysql_fetch_object($sql)){

//print out table contents and add id into an array and email into an array

echo '<tr>
<td><input type="hidden" name="id[]" value='.$r->$valor1.' readonly></td>
<td>'.$r->$valor2.'</td>
<td><input name="email[]" type="text" id="price" value="'.$r->$valor3.'"></td>
</tr>';
}

//submit button


echo' <tr>
<td colspan="3" align="center"><input type="submit" name="Submit" value="Submit"></td>
</tr>
</table>
</form>';


// if form has been submitted, process it


if(isset($_POST["Submit"]))
{
   // get data from form
   
 $name = $_POST['name'];
   
   // loop through all array items
   
   foreach($_POST['id'] as $value)
   {
    
   // minus value by 1 since arrays start at 0      
   
           $item = $value-1;
           
                //update table
              
    //appending suggested changes  
    //place of var_dumps
   //$sql1 = mysql_query("UPDATE $tabela SET $valor3='$valor3[$item]' WHERE     $valor1='$value'") or die(mysql_error());
   $sql1 = mysql_query("UPDATE $tabela SET $valor3='$email[$item]' WHERE $valor1='$value'") or die(mysql_error());


                                
   }

// redirect user

$_SESSION['success'] = 'Updated';
header("location:index.php");
}
  

Проблема в том, что после нажатия кнопки «Отправить» таблица базы данных просто становится странной.

 From This:
mysql> select * from AtuadorAnalogico;
 ------- --------- ---------- 
| AA_id | AA_nome | AA_valor |
 ------- --------- ---------- 
|     0 | nome1   | d        |
|     1 | nome2   | Agfd     |
|     2 | nome3   | Aasd     |
|     3 | nome4   | _asda    |
|     5 | teste5  | a        |
|     6 | teste6  | asda     |
|     7 | testte1 | o        |
|     8 | testte2 | rwqdq    |
|     9 | asdadsd | gwrg     |
|    10 | asdadsd | qdw      |
|    11 | adasd   | 234      |
|    12 | adasd   | g42      |
 ------- --------- ---------- 
12 rows in set (0.00 sec)
  

и

 To This:
mysql> select * from AtuadorAnalogico
 ------- --------- ---------- 
| AA_id | AA_nome | AA_valor |
 ------- --------- ---------- 
|     0 | nome1   |          |
|     1 | nome2   |          |
|     2 | nome3   |          |
|     3 | nome4   |          |
|     5 | teste5  |          |
|     6 | teste6  |          |
|     7 | testte1 |          |
|     8 | testte2 |          |
|     9 | asdadsd |          |
|    10 | asdadsd |          |
|    11 | adasd   |          |
|    12 | adasd   |          |
 ------- --------- ---------- 
12 rows in set (0.00 sec)
  

Пожалуйста, я действительно не вижу своей ошибки.

Большое спасибо за доработку кода.

PS.: просто чтобы помнить. Когда я запускаю php в браузере, он показывает содержимое таблицы базы данных таким, какое оно есть. после нажатия кнопки отправить, все сходит с ума.

EDIT1

after renaming ‘valor3′ to ’email’, it is not writing the string to the table anymore.
but, leaving the whole column blank (writing blank in all column cells as shown above) .

EDIT2

in comments, we just figured that is a logical problem with the code.
just can’t figure out what to do.

Update

 the output from just before the sql1 query:
var_dump($email);
var_dump($tabela);
var_dump($item);
var_dump($valor3);
var_dump($valor1);
var_dump($value);

vardump $email: NULL
vardump $tabela: string(16) "AtuadorAnalogico"
vardump $item: int(-1)
vardump $valor3: string(8) "AA_valor"
vardump $valor1: string(5) "AA_id"
vardump $value: string(1) "0"

vardump $email: NULL
vardump $tabela: string(16) "AtuadorAnalogico"
vardump $item: int(0)
vardump $valor3: string(8) "AA_valor"
vardump $valor1: string(5) "AA_id"
vardump $value: string(1) "1"
vardump $email: NULL

vardump $tabela: string(16) "AtuadorAnalogico"
vardump $item: int(1)
vardump $valor3: string(8) "AA_valor"
vardump $valor1: string(5) "AA_id"
vardump $value: string(1) "2" 
  

ps.: i reduced the number of rows, so makes easyer to see and think.

I FOUND IT!

стек не позволил мне ответить на мой собственный вопрос, поэтому я редактирую по своему усмотрению.

переименование полей этой строки ‘name’ и ‘id’ на «»что угодно»»:

 <td><input name="valores[]" type="text" id="valores" value="'.$r->$valor3.'"></td>
  

переименовываем это в то же, что и раньше:

      $valores = $_POST['valores'];
  

изменение этого значения на РАВНОЕ (как указано @JA):

   $item = $value;
  

и адаптация запроса следующим образом:

     $sql1 = mysql_query("UPDATE $tabela SET $valor3='$valores[$item]' WHERE $valor1='$value'") or die(mysql_error());
  

и ЭТО СДЕЛАНО!

Большое спасибо за ваш мозговой штурм.

и особая благодарность @arielnmz, который подал мне идею сброса переменных, чтобы я мог найти логическую ошибку.

кстати, код завершен.

 <?php
$username = "root";
$password = "";
$hostname = "localhost"; 
$database = "domonet";
$tabela = "AtuadorAnalogico";
$valor1 = "AA_id";
$valor2 = "AA_nome";
$valor3 = "AA_valor";

//connection to the database

$dbhandle = mysql_connect($hostname, $username, $password) 
  or die("Unable to connect to MySQL");
echo "Connected to MySQL<br>";


//select a database to work with

$selected = mysql_select_db($database,$dbhandle) 
  or die("Could not select examples");
  echo "Connected ao banco<br>";

//get data from db

$sql = mysql_query("SELECT * FROM $tabela");
$count=mysql_num_rows($sql);

//start a table

echo '<form name="form1" method="post" action="">
<table width="292" border="0" cellspacing="1" cellpadding="0">';

//start header of table

echo '<tr>
<th>amp;nbsp;</th>
<th>Name</th>
<th>Email</th>
</tr>';

//loop through all results

while($r=mysql_fetch_object($sql)){

//print out table contents and add id into an array and email into an array
    
echo '<tr>
<td><input type="hidden" name="id[]" value='.$r->$valor1.' readonly></td>
<td>'.$r->$valor2.'</td>
<td><input name="valores[]" type="text" id="valores" value="'.$r->$valor3.'"></td>
</tr>';
}

//submit button
    

echo' <tr>
<td colspan="3" align="center"><input type="submit" name="Submit" value="Submit"></td>
</tr>
</table>
</form>';

// if form has been submitted, process it

if(isset($_POST["Submit"]))
{
       // get data from form
       
     $valores = $_POST['valores'];
     
       // loop through all array items
       
   foreach($_POST['id'] as $value)
       {
       // minus value by 1 since arrays start at 0 (not anymore)
        
               $item = $value;
                //update table

       $sql1 = mysql_query("UPDATE $tabela SET $valor3='$valores[$item]' WHERE     $valor1='$value'") or die(mysql_error());

   }

// redirect user

$_SESSION['success'] = 'Updated';
header("location:index.php");
};
  

Всем отличной ночи!

Комментарии:

1. Это не имеет смысла: SET $valor3 = '$valor3[$item]' . $valor3 это строка, а не массив, почему вы ее индексируете?

2. Имеет смысл. Но, когда я меняю его для массива, созданного в форме, просто ничего не происходит. Все пусто

3. Тогда вы делаете это неправильно. Пожалуйста, приложите обновленный код к вопросу. Также покажите HTML формы, чтобы мы могли определить, обращаетесь ли вы к правильным $_POST переменным.

4. $item = $value-1 Что вы имеете в виду под этим? И пользователь не опубликовал значение для $ valor3.

5. Может быть, это должно быть что-то вроде SET $valor3 = '{$_POST[$valor3][$item]}' ?

Ответ №1:

Измените элемент формы для электронной почты следующим образом..

 <input name="email['.$r->$valor1.']" type="text" id="price" value="'.$r->$valor3.'">
  

Вы можете избавиться от элемента «id[]»

Затем цикл,

 foreach($_POST['email'] as $id=>$value)

$sql1 = mysql_query('UPDATE '.$tabela.' SET '.$valor3.'="'.$value.'" WHERE '.$valor1.'="'.$id.'" LIMIT 1') or die(mysql_error());
  

Убедитесь, что вы ввели что-то в поле электронной почты, прежде чем нажать отправить.

Комментарии:

1. Круто! Рад, что вы нашли решение самостоятельно. var_dump(), безусловно, лучший способ начать отладку, не так ли?