• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Jedno zapytanie INSERT wiele rekordów

VPS Starter Arubacloud
0 głosów
532 wizyt
pytanie zadane 7 marca 2020 w PHP przez franz Gaduła (4,940 p.)

Nie wiem jak się za to zabrać , brak jakiegokolwiek pomysłu 

Chciałbym zrobić coś takiego 

Tabela :

ID tytul adres

Chciałbym wstawić wiele adresów do tego samego tytułu 

W tabeli ma to wyglądać tak ID jest AI  więc nie będę uzupełniał 

ID     tytul             adres

        jakiś tytuł      http:// adres.pl/sos_tam

        jakiś tytuł      http:// adres.pl/sos_tam1

        jakiś tytuł      http:// adres.pl/sos_tam2

        jakiś tytuł      http:// adres.pl/sos_tam3

        jakiś tytuł      http:// adres.pl/sos_tam4

Wstawiane będą fotki ale w różnych wersjach , chcę żeby to było wstawiane tak jak pokazałem powyżej 

Wstawianie każdego rekoru osobno jest najzwyczajniej męczące .Pomyślałem że można by zrobić formularz z polem textarea i wstawić wszystkie adresy na raz.

<form action="" method="post" accept-charset="utf-8">
	<textarea name="nazwa" cols="35" rows="8" ></textarea>
	<input type="submit" value="Dodaj" />
</form>

Pytanie tylko jak to zrobić i czy są jakieś ograniczenia (ilość adresów jakie mogę przesłać jednym postem)? Testowałem powyższy formularz , odebrałem i wyświetliłem to co wysyłam jednak nie przesłało się wszystko. 

<?php

 echo $_POST['nazwa'];

Wyświetlił tylko 10 linijek z 20 jakie dodałem 

 Jak odebrać te dane i dodać do zapytania i w końcu jak skonstruować zapytanie INSERT które wstawi to wszystko ? 

Za każdą pomoc z góry dziękuje 

 

1 odpowiedź

+1 głos
odpowiedź 7 marca 2020 przez Mariusz08 Maniak (62,300 p.)
Co do wstawiania kilku rekordów jednym zapytaniem - https://stackoverflow.com/a/452934 . Po prostu podajesz wiele wartości
komentarz 7 marca 2020 przez franz Gaduła (4,940 p.)
Dzięki to rozwiązuje jeden problem , pozostaje teraz problem z przesłaniem tego

Ale również jak dodać do zapytania to co przyjdzie , skoro to będzie w jednym polu to będzie jedna zmienna .Jak ją teraz rozbić na poszczególne elementy.

echo wyświetla wszystko w osobnych liniach , ale jak dodać to do zapytania żeby do bazy wstawiło się to każdy w osobnym wierszu
komentarz 7 marca 2020 przez Mariusz08 Maniak (62,300 p.)

Możesz rozbić tego stringa za pomocą explode po znaku nowej linii (\n)

komentarz 7 marca 2020 przez franz Gaduła (4,940 p.)

Coś robię źle , wiem chyba co ale nie wiem jak to naprawić

Notice: Array to string conversion in 

 to w linii 

$query->bindParam(':link',$linki,PDO::PARAM_STR);

przekazuje to bezpośrednio

 

$link=$_POST['link'];
	$linki=explode('\n',$link);

A najwyraźniej ten post przychodzi jako tablica czy może ten explode zamienia to  w tablice .Tak czy inaczej jest tablica ARRAY 

Zrobiłem więc tak

if(isset($_POST['tytul'])){
	$tytul= $_POST['tytul'];
	$link=$_POST['link'];
	$linki=explode('\n',$link);
	
	$query=$db->prepare("INSERT INTO tabela (id,tytul,link) VALUES ( NULL,:tytul,:link) ");
	$query->bindParam(':tytul',$tytul,PDO::PARAM_STR);
	foreach( $linki as $wstaw){
	
	$query->bindParam(':link',$wstaw,PDO::PARAM_STR); 
	
}
	$query->execute();
	echo 'poszlo';

i wstawia ale wszystko w jeden wiersz , a chce żeby każdy link był w osobnym wierszu.Jak to poprawić ?  

komentarz 7 marca 2020 przez Mariusz08 Maniak (62,300 p.)

Musisz iterować po tablicy, i wtedy dopiero dodawać coś do zapytania

<?php

$data = ['one', 'two', 'three'];
$sql = 'INSERT INTO `sth` VALUES ';

foreach ($data as $obj) {
 $sql .= '("' . $obj . '"), ';
}

var_dump($sql);

Oczywiście nie jest to idealny kod i on nie będzie działał, ale mniej-więcej coś takiego.

komentarz 7 marca 2020 przez franz Gaduła (4,940 p.)

Kurcze problem w tym że to z posta przychodzi jako jedna linia tekstu 

Nie wiem jak to rozbić na osobne linie 

Ani explode ani str_replace nie działa ,nadal wyświetla się wszystko w jednej linii 

Jak to rozbije na osobne linie to pewnie w INSERT tez doda się to osobno 

komentarz 8 marca 2020 przez franz Gaduła (4,940 p.)

trochę udało mi się już zrobić ale znowu utknąłem i nie wiem jak to przeskoczyć 

Mam taki kod 

$tytul= $_POST['tytul'];
	$link=$_POST['link'];
	$linki=explode("<br />", nl2br($_POST['link']));
	$data = [$linki];
	foreach( $data as $wstaw){
		
		foreach($wstaw as $d){
			echo $d.'<br>';
			
		$sezon= substr($d,0,4);
		echo $sezon.'<br>';
    
        $gdzie = substr($d,5,4);
		echo $gdzie.'<br>';
		
		}
	}

Całość wyświetla się dobrze , ale potrzebuje z tego co przychodzi z posta wyciągnąć do osobnej kolumny 4 pierwsze znaki(lato lub zima) i do innej następne 4  (morze lub gory)

Linki mają taką postać 

lato woda  http://adres_fotki.pl/
zima woda http://adres_fotki.pl/
lato gory http://adres_fotki.pl/
zima gory http://adres_fotki.pl/
lato woda http://adres_fotki.pl/
zima woda http://adres_fotki.pl/

Kod powyżej wyświetla prawidłowo cały link ,natomiast funkcja  substr pokazuje prawidłowo tylko pierwszy record w pozostałych dziwne wpisy

lato woda http://adres_fotki.pl/
lato
woda
zima woda http://adres_fotki.pl/
zi
a wo
lato gory http://adres_fotki.pl/
la
o go
zima gory http://adres_fotki.pl/
zi
a go
lato woda http://adres_fotki.pl/
la
o wo
zima woda http://adres_fotki.pl/
zi
a wo

Nie wiem co robię źle ,doradźcie jak to zrobić 

 

komentarz 8 marca 2020 przez franz Gaduła (4,940 p.)

Już to rozgryzłem udało mi się wyodrębnić wszystko ale nadal mam problem.Poniżej kod który działa tylko w połowie 

$data = [$linki];
	$query=$db->prepare("INSERT INTO tabela (id,tytul,link,se,od,co) VALUES (NULL,:tytul,:link,:se,:od,:co) ");
	foreach( $data as $wstaw){
		foreach($wstaw as $d){
			$c=explode(" ",$d);
			$s=$c[0];$e=$c[1];$l=$c[2]; // tu problem 
//Undefined offset: 1  Undefined offset: 2
			$query->bindParam(':tytul',$tytul,PDO::PARAM_STR);
			$query->bindParam(':link',$l,PDO::PARAM_STR);
			$query->bindParam(':se',$s,PDO::PARAM_STR);
			$query->bindParam(':od',$e,PDO::PARAM_STR);
			$query->bindParam(':co',$co,PDO::PARAM_STR);
			$query->execute();
			echo $l.'<br>'; // tu wyświetla prawidłowo wszystko 
			
			}
		}
Fatal error: Uncaught PDOException: SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'link' cannot be null 

Nie wiem dlaczego takie błędy 

Rozumiem error bazy ale dlaczego te błędy Undefined offset ??

Doradźcie jak to naprawić 

komentarz 9 marca 2020 przez franz Gaduła (4,940 p.)

Już prawie wszystko z tym rozpracowałem i działa pozostała jeszcze jedna kwestia 

Mianowicie, zapisuje mi recordy do bazy w dziwny sposób zostawiając jedną pustą linie

Pierwszy zapisany record jest dobrze jak widac ale wszystkie pozostałe linie poniżej

Jak to naprawić ? Co jest tego przyczyną ? 

 

komentarz 9 marca 2020 przez Mariusz08 Maniak (62,300 p.)
Prawdopodobnie robisz explode po złym stringu i zostaje Ci \n cały czas - spróbuj w każdym stringu zamienić \n na '' i powinno działać.
komentarz 9 marca 2020 przez franz Gaduła (4,940 p.)

Nie bardzo wiem co masz na myśli , nie mogę robić explode innego stringa 

$link=$_POST['link_dodaj'];
//................
$linki=explode("<br />", nl2br($link));
//................
$data = [$linki];
	$query=$db->prepare("INSERT INTO tabela (id,tytul,link,se,od,co,tl) VALUES (NULL,:tytul,:link,:se,:od,:co,:tl) ");
	foreach( $data as $wstaw){
		foreach($wstaw as $d){
			[$s, $e, $l] = explode(" ",$d);
			$query->bindParam(':tytul',$tytul,PDO::PARAM_STR);
			$query->bindParam(':link',$l,PDO::PARAM_STR);
			$query->bindParam(':se',$s,PDO::PARAM_STR);
			$query->bindParam(':od',$e,PDO::PARAM_STR);
			$query->bindParam(':co',$co,PDO::PARAM_STR);
			$query->bindParam(':tl',$tl,PDO::PARAM_STR);
			$query->execute();
			}
		}

 Tak wygląda całość kodu która wykonuje insert 

Tylko Zmienna $s  zapisuje się błędnie w bazie pozostałe zapisują się dobrze 

$link to zmienna przyjmująca to co przychodzi z formularza z pola textarea 

Pierwszy explode rozbija to na pojedyncze wiersze , następny explode rozbija wiersze na części składowe po spacjach 

Być może przy okazji dodaje \n ale nie mam pomysłu jak się go pozbyć 

Próbowałem tak 

str_replace("<br>", "", $s);
str_replace("<br>", "", $l);
str_replace("<br>", "", $e);


str_replace("\n", "", $s);
str_replace("\n", "", $l);
str_replace("\n", "", $e);

Niestety jedyny efekt to dodatkowy wiersz w tabeli z zapisanymi zmiennymi 

$tytul , $co , $tl 

A to co przedstawiłem na obrazku nadal jest 

Jakiś pomysł jak to naprawić 

 

Podobne pytania

0 głosów
2 odpowiedzi 495 wizyt
pytanie zadane 28 września 2019 w SQL, bazy danych przez niezalogowany
0 głosów
0 odpowiedzi 114 wizyt
+1 głos
3 odpowiedzi 399 wizyt

92,452 zapytań

141,262 odpowiedzi

319,077 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...