0 votes
in SoSci Survey (dt.) by s083446 (130 points)
edited by s083446

Hallo,

ich habe mir ein Array programmiert, in dem pro Zeile zwei Informationen gespeichert werden. Wie kann ich dieses Array nun in der Datenbank für die Auswertung speichern?

Liebe Grüße,
Nadine

by SoSci Survey (302k points)
Ist vorab bestimmbar, wie viele Einträge (Zeilen) das Array haben wird? Oder gibt es eine maximale Anzahl an Einträgen? Benötigen Sie die Daten in einzelnen Variablen im Datensatz oder nur "en block" (z.B. als JSON-String)?
by s083446 (130 points)
Nein leider nicht, da die Probanden alles was ihnen auffällt notieren sollen und das natürlich stark variieren kann.
by SoSci Survey (302k points)
Dann werden Sie eine Obergrenze definieren müssen. Denn so viele (x2) interne Variablen müssen Sie vorsehen - natürlich nur, wenn Sie die Daten als getennte Variablen und nicht als JSON-String im Datensatz haben möchten.

Nur am Rande: Eine Auswertung ohne vorab definierte Grenzen ist wenig sinnvoll. Was bringt es denn, wenn die Teilnehmer 5-10 Einträge machen - und einer macht 5000? Das wäre in jedem Fall ein Ausreißer, der aus dem Sample fliegen würde...
by s083446 (130 points)
ich benötige die Daten am Ende zeilenweise gekoppelt. Also alles was in der ersten Zeile steht sollte irgendwie einander zuzuordnen sein genauso wie die Einträge in der zweiten Zeile. Alles andere ist egal.
by SoSci Survey (302k points)
Und Sie könnten in der Auswertung mit einem Ergebnis-String (in einer Variable) wie folgt umgehen: "Eintrag A1, Eintrag A2, Eintrag B1, Eintrag B2, Eintrag C1, Eintrag C2, Eintrag D1, Eintrag D2" - oder doch lieber in getrennten Variablen?
by s083446 (130 points)
Ja das stimmt das wird wahrscheinlich sinnvoll sein. Nehmen wir an ich setze als Obergrenze 20 Zeilen. Wie kann ich dann das Array speichern?
by s083446 (130 points)
Ich glaube getrennte Variablen wären einfacher bezüglich der späteren Auswertung. Ich habe einen Eintrag pro Zeile "Zeit" und einen Eintrag "Text". Diese beiden Spalten als Variablen zu speichern wäre natürlich ideal.

1 Answer

0 votes
by SoSci Survey (302k points)

Ich würde für Ihren Fall empfehlen, dass Sie 2 Fragen "interne Variablen" mit jeweils 20 Items anlegen. Dann gehört z.B. IV01_01 zu IV02_01 und IV01_02 zu IV02_02. Prinzipiell könnte man natürlich auch eine Frage mit 40 Variablen anlegen, aber dann ist es m.E. etwas schwieriger bei der Auswertung.

Gehen wir einmal davon aus, dass Ihre Array $a heißt (und keine Schlüssel verwendet, sondern Indizes) und die beiden Fragen IV01 und IV02. Dann würde der Code wie folgt aussehen:

$fragen = array('IV01', 'IV02');
for ($i=0; $i<count($a); $i++) {
  for ($j=0; $j<2; $j++) {
    put(id($fragen[$j], $i + 1), $a[$i][$j]);
  }
}

Okay, das ist recht kompakt. Die äußere FOR-Schleife wandert einfach durch alle Zeilen des Arrays (Index $i). Und die innere Schleife ruft immer die "Spalten" ab (0 und 1).

Die Fragen sind im Array $fragen gespeichert, sodass fragen[$i] immer IV01 für Spalte 0 (Zeit) und IV02 für Spalte 1 (Text) liefert.

Die Funktion id() baut aus der Frage-Kennung und der Zeilennummer ($i + 1, denn $i beginnt mit 0) eine Variablen-Kennung zusammen, also z.B. IV01 + 2 = IV01_02.

Das put() speichert dann in diese Variable den entsprechenden Eintrag aus dem Array $a[$i][$j].

by s083446 (130 points)
Ich bekomm es noch nicht ganz hin diesen Code mit meinem Array in Verbindung zu setzen. Mein Code um die Daten bei jedem Klick auf den Beobachtungsbutton zu erfassen sieht folgendermaßen aus:

var i = 0;
var Tabelle = new Array();

function Speichern(){
Tabelle[i] = new Object();
Tabelle[i]["Zeit"] = player.currentTime;
Tabelle[i]["Text"] = document.querySelector("#vname").value;
i++;}

Kann ich das dann wie oben beschrieben irgendwie machen?
by SoSci Survey (302k points)
Okay ... Sie hatten nicht geschrieben, dass Sie JavaScript Code anstatt PHP-Code verwenden :)

Ziehen Sie die beiden Fragen ("interne Variablen") in die Seite, dann verwenden Sie im JavaScript bitte folgenden Code:

var fragen = ['IV01', 'IV02'];
for (var i=0; i<Tabelle.length; i++) {
  var itemID = String(i);
  if (itemID.length < 2) itemID = "0" + itemID;
  var varID1 = fragen[0] + "_" + itemID;
  var varID2 = fragen[1] + "_" + itemID;
  document.getElementById(varID1).value = Tabelle[i]["Zeit"];
  document.getElementById(varID1).value = Tabelle[i]["Text"];
}

Das wäre jetzt die Funktion, die Sie am Ende der Aufzeichnung aufrufen müssten. Aber Sie können auch direkt in die Variablen speichern (einfacher):

function Speichern(){
  var itemID = String(i);
  if (itemID.length < 2) itemID = "0" + itemID;
  document.getElementById("IV01_" + itemID).value = player.currentTime;
  document.getElementById("IV02_" + itemID).value = document.querySelector("#vname").value;
  i++;
}
by s083446 (130 points)
Jetzt muss ich leider doch nochmal eine Frage dazu stellen, da ich den Code leider noch nicht wirklich verstehe:
Ich verstehe noch nicht ganz, wie ich die beiden Variablen definieren muss, und ob ich mein programmiertes Array dann so wie es ist drin lasse oder nicht.
by SoSci Survey (302k points)
Sie legen zwei Fragen (im Beispiel mit den Kennungen IV01 und IV02) an, Fragetyp "interne Variablen". Beide müssen jeweils 20 Items (Variablen) enthalten. Diese beide Fragen "ziehen" Sie in die Seite, auf welcher auch der JavaScript-Code steht.

Dann verwenden Sie den unteren Code aus meinem letzten Kommentar (sonst nichts) und testen einmal, ob es funktioniert. Wenn nicht, dann prüfen Sie bitte als erstes die JavaScript-Fehlerkonsole im Browser.
by s083446 (130 points)
Ich habe jetzt zwei Variablen mit jeweils 20 Items angelegt und ihren Code eingefügt, allerdings funktioniert das leider nicht. Ich muss zugeben, dass ich Ihren Code leider auch nicht ganz verstehe, weshalb ich selbst nicht darauf komme woran es liegt. Ich würde jetzt nochmal kurz schildern, was ich gemacht habe:

Ich habe zwei Variablen (A002 und A003) mit 20 Items angelegt und diese vor meinem HTML-Code in den Fragebogen gezogen.
Dann folgt folgender HTML-Code mit den entsprechenden Funktionen, die mit jeweils beim Klick des buttons 'pause' eine Zeit generieren und ein Textfenster öffnen. Beim schließen des Textfensters wird der eingegebene Text mit der vorher erfassten Zeit erfasst und das Video läuft weiter. Der Gesamtcode sieht wie folgt aus:

<video id="player" width="512" height="288" autoplay="autoplay">
<source src="pro://Test.mp4" type="video/mp4"/>
</video>

<script src="interactive.js"></script>
<script>
   Interactive.init();
</script>

<button type="button" id="pause" onclick="buttonShow()">Pause</button>
<button type="button" id="test" onclick="Test()">Video zu Ende gesehen</button>

<p id="ausgabe"></p>
<p id="text"></p>

<!-- Info-Box -->
<div id="infoBox" style="width: 500px; padding: 10px; background-color: white; border: 2px solid #CCCCCC">
 <label for="vname">Notieren Sie hier Ihre Beobachtung. <input type="text" id="vname" name="vname"> </label>
  <p style="text-align: center; margin-top: 20px">
    <button type="button" id="play" onclick="buttonHide()">Schließen</button>
  </p>
</div>

<script>
  document.getElementById('pause').addEventListener('click', function() { player.pause(); document.getElementById('ausgabe').innerHTML = 'Die Dauer des Videos beträgt: '+ player.currentTime +' Sekunden.'}, false);
  document.getElementById('play').addEventListener('click', function() { player.play(); Speichern(); document.getElementById('text').innerHTML = document.querySelector("#vname").value; document.getElementById('vname').value = '';}, false);
</script>

<script type="text/javascript">
var info = document.getElementById("infoBox");
info.style.display = "none"; // Box ausblenden
info.style.position = "absolute";
info.style.zIndex = 999;
info.style.marginTop = "10px";
 
function buttonShow() {
  // Infobox anzeigen
  info.style.display = "";}

function buttonHide() {
  // Infobox wieder ausblenden
  info.style.display = "none";}

var i = 0;
var Tabelle = new Array();

function Speichern(){
Tabelle[i] = new Object();
Tabelle[i]["Zeit"] = player.currentTime;
Tabelle[i]["Text"] = document.querySelector("#vname").value;
window.alert(i + " " + Tabelle[i]["Zeit"] + " " + Tabelle[i]["Text"] + "\n");
i++;}

// Knopf zunächst ausblenden
SoSciTools.submitButtonsHide();
// Nach 600000 msec Knopf einblenden

function Test(){
var s = new Object();
s = player.currentTime;

if (s == 34.687999){
window.setTimeout(
  SoSciTools.submitButtonsDisplay, 500)}
else{ window.alert("Das Video ist noch nicht zu Ende.")}}
</script>

Ich wollte Ihren Code in die if-Funktion am Ende mit einbauen, da hier das Video zu Ende geschaut wurde und die nächtste Seite aufgerufen werden kann. Was muss ich hier jetzt noch machen, damit die Daten tatsächlich in der Datenbank gespeichert werden?

Vielen Dank schonmal.
by SoSci Survey (302k points)
Mein Code waar so gedacht, dass sie die bereits vorhandene function Speichern() ersetzen :)

Das IV01 und IV02 müssten Sie entsprechend durch A002 und A003 ersetzen.
by s083446 (130 points)
Das hatte ich auch so versucht, allerdings ist dann die Funktion, die das Textfenster leert, sobald es geschlossen aus irgend einem Grund gestört, da das Textfenster mit dem vorher geschriebenen Text wieder geöffnet wird.
by SoSci Survey (302k points)
Das kann passieren, wenn der Code noch nicht funktioniert und deshalb abbricht. Kontrollieren Sie die Fehlerkonsole des Browsers und posten Sie gerne, worüber sich diese beschwert. Sie können auch gerne einen Pretest-Link direkt (!) zur betroffenen Seite posten.
by s083446 (130 points)
Ah ich habe das Problem gefunden. Ich musste i=1 setzen, damit er die Variablen findet. Jetzt funktioniert die Datenanbindung und auch alle Funktionen.

Vielen Dank für Ihre Hilfe!!

Willkommen im Online-Support von SoSci Survey.

Hier bekommen Sie schnelle und fundierte Antworten von anderen Projektleitern und direkt von SoSci Survey.

→ Eine Frage stellen


Welcome to the SoSci Survey online support.

Simply ask a question to quickly get answers from other professionals, and directly from SoSci Survey.

→ Ask a Question

...