Autor Zpráva
Jan Žák
Profil
Dobrý den všem,

rád bych Vás požádal o pomoc či náízornou lekci. Mám tento funkční skript, který mi ukládá vícero hodnot do databáue. Počet input polí si přidávám pomocí jquery dle potřeby.
if (isset($_POST['submit'])) {

$count = count($_POST['beginning-place']);
$query_values = array();

for($i=0; $i<$count; $i++){

$c1 = mysql_real_escape_string($_POST['beginning-place'][$i]);
$c2 = mysql_real_escape_string($_POST['beginning-date'][$i]);
$c3 = mysql_real_escape_string($_POST['beginning-time'][$i]);
$c4 = mysql_real_escape_string($_POST['cities'][$i]);
$c5 = mysql_real_escape_string($_POST['purpose'][$i]);
$c6 = mysql_real_escape_string($_POST['end-place'][$i]);
$c7 = mysql_real_escape_string($_POST['end-date'][$i]);
$c8 = mysql_real_escape_string($_POST['end-time'][$i]);

$query_values[] = " ('$c1','$c2','$c3','$c4','$c5','$c6','$c7','$c8') ";
}

$values = implode(',', $query_values);

  // check that required fields are filled in
  if ($c1 && $c2 && $c3 && $c4 && $c5 && $c6 && $c7 && $c8) {

  $sql = "INSERT INTO cesta (`beginning-place`, `beginning-date`, `beginning-time`, `cities`, `purpose`, `end-place`, `end-date`, `end-time`) VALUES $values";
  mysql_query( $sql );

  // once saved, redirect back to the view page
  $success = 'Cestovní příkaz úspěšně vložen'; 
  } else {
  // generate error message
  $error = 'Všechna pole jsou povinná!';
  }
}

Rád bych toto převedl do PDO, ale nevím si rady, PDO se začínám teprve učit. Mohl bych požádat o názornou ukázku, nebo radu jak začít? Děkuji mnohokrát.
Jan Žák
Profil
Dobrý den trošku jsem popátral a zhotovil tento příkaz:
if (isset($_POST['submit'])) {

$datafields = array(`beginning-place`, `beginning-date`, `beginning-time`, `cities`, `purpose`, `end-place`, `end-date`, `end-time`);

$data[] = array(`beginning-place` => `beginning-place[]`, `beginning-date` => `beginning-date[]`, `beginning-time` => `beginning-time[]`, `cities` => `cities[]`, `purpose` => `purpose[]`, `end-place` => `end-place[]`, `end-date` => `end-date[]`, `end-time` => `end-time[]`);

function placeholders($text, $count=0, $separator=","){
    $result = array();
    if($count > 0){
        for($x=0; $x<$count; $x++){
            $result[] = $text;
        }
    }

    return implode($separator, $result);
}
$db->beginTransaction();
$insert_values = array();
foreach($data as $d){
    $question_marks[] = '('  . placeholders('?', sizeof($d)) . ')';
    $insert_values = array_merge($insert_values, array_values($d));
}

$sql = "INSERT INTO routes (" . implode(",", $datafields ) . ") VALUES " . implode(',', $question_marks);

$stmt = $db->prepare ($sql);
try {
    $stmt->execute($insert_values);
} catch (PDOException $e){
    $error[] = $e->getMessage();
}
$db->commit();

}

Bohužel při odeslání dostávám tuto chybu:

SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ',,,,,,) VALUES (NULL)' at line 1

Nevíte někdo v čem dělám chybu?
Keeehi
Profil
Na řádku 25 si vypiš proměnnou $sql. Ale tuším, ze ti budou chybět závorky kolem vkládaných hodnot.
Jan Žák
Profil
Keeehi:
Díky za info, zkusil jsem si to vypsat ale i tak se mi nedaří přijít kde je chybka, mám to teď takto:
$fieldnames = array('beginning-place', 'beginning-date', 'beginning-time', 'cities', 'purpose', 'end-place', 'end-date', 'end-time');

$data[] = array('beginning-place' => 'beginning-place[]', 'beginning-date' => 'beginning-date[]', 'beginning-time' => 'beginning-time[]', 'cities' => `cities[]`, 'purpose' => `purpose[]`, 'end-place' => `end-place[]`, 'end-date' => `end-date[]`, 'end-time' => `end-time[]`);

function placeholders($text, $count=0, $separator=","){
    $result = array();
    if($count > 0){
        for($x=0; $x<$count; $x++){
            $result[] = $text;
        }
    }

    return implode($separator, $result);
}
$db->beginTransaction();
$insert_values = array();
foreach($data as $d){
    $question_marks[] = '('  . placeholders('?', sizeof($d)) . ')';
    $insert_values = array_merge($insert_values, array_values($d));
}

$sql = "INSERT INTO routes (" . implode(",", $fieldnames ) . ") VALUES " . implode(',', $question_marks);

$stmt = $db->prepare ($sql);
try {
    $stmt->execute($insert_values);
} catch (PDOException $e){
    $error[] = $e->getMessage();
}
$db->commit();

A zde je chyba co se zobrazí i s echem:

SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '-place,beginning-date,beginning-time,cities,purpose,end-place,end-date,end-time)' at line 1

string(134) "INSERT INTO routes (beginning-place,beginning-date,beginning-time,cities,purpose,end-place,end-date,end-time) VALUES (?,?,?,?,?,?,?,?)" 
Fisir
Profil
Reaguji na Jana Žáka:
Zkus první dva řádky upravit takto:
$fieldnames = array('`beginning-place`', '`beginning-date`', '`beginning-time`', 'cities', 'purpose', '`end-place`', '`end-date`', '`end-time`');
 
$data[] = array('`beginning-place`' => 'beginning-place[]', '`beginning-date`' => 'beginning-date[]', '`beginning-time`' => 'beginning-time[]', 'cities' => `cities[]`, 'purpose' => `purpose[]`, '`end-place`' => `end-place[]`, '`end-date`' => `end-date[]`, '`end-time`' => `end-time[]`);
Pravděpodobně vadí pomlčky v názvech sloupců, ale netestoval jsem to.

Taky ti patří pochvala za to, že migruješ z ext/mysql. Spousta lidí, kterým to tu doporučíme, na to i přes zjevné potíže v budoucnosti kašlou.
Jan Žák
Profil
Fisir:
Děkuji, tohle by mě fakt nenapadlo, že by vadili pomlčky ve sloupcích. Opravil jsem to, stránka je nyní bez chyb, ale uloží to pouze texty v data array, viz mysql dump:

INSERT INTO `routes` (`id`, `beginning-place`, `beginning-date`, `beginning-time`, `cities`, `purpose`, `end-place`, `end-date`, `end-time`) VALUES
(1, 'beginning-place[]', 'beginning-date[]', 'beginning-time[]', 'cities[]', 'purpose[]', 'end-place[]', 'end-date[]', 'end-time[]');

zkoušel jsem do scriptu vložit i POST, ale bez úspěchu. Zde je teď celý kód:

header.php
<!DOCTYPE html>
<html lang="cs">

<head>

  <meta charset="utf-8">

  <title><?php if(isset($title)){ echo $title; }?></title>

  <script type='text/javascript' src='jquery/jquery-2.2.1.min.js'></script>

  <script type="text/javascript">
  $(document).ready(function(){
    var i=1;

  $("#add_row").click(function(){
    $('#addr'+i).html("<td>"+ (i+1) +"</td><td><input name='beginning-place[]' type='text' placeholder='Odkud' class='form-control input-md' /></td><td><input name='beginning-date[]' type='text' placeholder='Datum' class='form-control input-md'></td><td><input name='beginning-time[]' type='text' placeholder='Hodina' class='form-control input-md'></td><td><input name='cities[]' type='text' placeholder='Místo jednání' class='form-control input-md'></td><td><input name='purpose[]' type='text' placeholder='Účel cesty' class='form-control input-md'></td><td><input name='end-place[]' type='text' placeholder='Kam' class='form-control input-md'></td><td><input name='end-date[]' type='text' placeholder='Datum' class='form-control input-md'></td><td><input name='end-time[]' type='text' placeholder='Hodina' class='form-control input-md'></td>");

    $('#tab_logic').append('<tr id="addr'+(i+1)+'"></tr>');
      i++; 
  });

  $("#delete_row").click(function(){
    if(i>1){
      $("#addr"+(i-1)).html('');
      i--;
    }
  });

  });
  </script>

  <link rel="stylesheet" href="bootstrap-3.3.6-dist/css/bootstrap.min.css">
  <link rel="stylesheet" href="css/main.css">

</head>

if (isset($_POST['submit'])) {

$fieldnames = array('`beginning-place`', '`beginning-date`', '`beginning-time`', 'cities', 'purpose', '`end-place`', '`end-date`', '`end-time`');

$data[] = array('`beginning-place`' => 'beginning-place[]', '`beginning-date`' => 'beginning-date[]', '`beginning-time`' => 'beginning-time[]', 'cities' => 'cities[]', 'purpose' => 'purpose[]', '`end-place`' => 'end-place[]', '`end-date`' => 'end-date[]', '`end-time`' => 'end-time[]');

function placeholders($text, $count=0, $separator=","){
    $result = array();
    if($count > 0){
        for($x=0; $x<$count; $x++){
            $result[] = $text;
        }
    }

    return implode($separator, $result);
}
$db->beginTransaction();
$insert_values = array();
foreach($data as $d){
    $question_marks[] = '('  . placeholders('?', sizeof($d)) . ')';
    $insert_values = array_merge($insert_values, array_values($d));
}

$sql = "INSERT INTO routes (" . implode(",", $fieldnames ) . ") VALUES " . implode(',', $question_marks);

$stmt = $db->prepare ($sql);
try {
    $stmt->execute($insert_values);
} catch (PDOException $e){
    $error[] = $e->getMessage();
}
$db->commit();

}

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: