Avatar billede henninghabor Nybegynder
06. september 2006 - 14:45 Der er 8 kommentarer og
1 løsning

Forbedring af database kald

Hej,

Ka' du hjælpe med at forbedre nedenstående database kald, så det evt. kun er et kald, f. eks. vha. joins?

$query = mysql_query("SELECT id, question FROM polls_questions WHERE starts <= CURDATE() AND ends >= CURDATE()") or die(mysql_error());

if(mysql_num_rows($query) > 0)
{
    while($row = mysql_fetch_assoc($query))
    {
        $id = $row["id"];
        $question = htmlentities($row["question"]);

        $output .= "<form action=\"http://" . $_SERVER["HTTP_HOST"] . "/afstemninger/\" method=\"post\">\n";
        $output .= "<p>" . $question . "";

        $queryInner = mysql_query("SELECT SUM(votes) AS votes FROM polls_answers WHERE questions = '" . $id . "'") or die(mysql_error());

        if(mysql_num_rows($queryInner) > 0)
        {
            while($rowInner = mysql_fetch_assoc($queryInner))
            {
                $votes = $rowInner["votes"];

                $output .= " (" . $votes . " stemmer)</p>\n";
            }
        }

        mysql_free_result($queryInner);

        $output .= "<p>";

        $queryInner = mysql_query("SELECT id, answer FROM polls_answers WHERE questions = '" . $id . "'") or die(mysql_error());

        if(mysql_num_rows($queryInner) > 0)
        {
            while($rowInner = mysql_fetch_assoc($queryInner))
            {
                $aid = $rowInner["id"];
                $answer = $rowInner["answer"];

                $output .= "<input type=\"radio\" name=\"answer\" value=\"" . $aid . "\"> " . $answer . "<br>\n";
            }
        }

        mysql_free_result($queryInner);

        $output .= "</p>\n";
        $output .= "<p><input type=\"submit\" name=\"submit\" value=\"Stem\"></p>\n";
        $output .= "</form>\n";
    }
}

mysql_free_result($query);
Avatar billede ferrari_brian Nybegynder
06. september 2006 - 15:08 #1
hvad vil du have ud af dit kald?

Du vil have:
polls_questions.question
SUM(polls_answers.votes) AS votes
polls_answers.id AS aid
polls_answers.answer

er dette korrekt?

Jeg har prøvet at lave noget som slet ikke er afprøvet men det kan være du kan bruge det:

function SqlFetch($Query) {
  $Result = mysql_query($Query);
  if(!$Result) {
    SqlPrintError("Could not: <em>$Query</em>");
  }
  $count = 0;
  while($Row = mysql_fetch_array($Result))
  {
    $ResultArray[] = $Row;
    ++$count;
  }
  if($count > 0)
  {
    return $ResultArray;
  }
  else
  {
    return 0;
  }
}
function SqlPrintError($Error) {
  echo "<p>$Error";

  if ($MysqlError = mysql_error()) {
    echo "<br>Error: <em>$MysqlError</em>";
  }

  exit;
}

$QueryArray = SqlFetch("SELECT polls_questions.question, SUM(polls_answers.votes) AS votes FROM polls_questions LEFT JOIN polls_answers ON polls_questions.id = polls_answers.questions WHERE starts <= CURDATE() AND ends >= CURDATE()");
if(!empty($QueryArray))
{
  for ($i = 0; $i < sizeof($QueryArray); $i++)
  {
    extract($QueryArray[$i]);
    $output .= "<form action=\"http://" . $_SERVER["HTTP_HOST"] . "/afstemninger/\" method=\"post\">\n";
    $output .= "<p>" . $question . "";
    $output .= " (" . $votes . " stemmer)</p>\n";
    $output .= "<p>";
    $queryInner = SqlFetch("SELECT polls_answers.id AS aid, polls_answers.answer FROM polls_answers WHERE questions = '" . $id . "'");
    for ($j = 0; $j < sizeof($queryInner); $j++)
    {
      extract($queryInner[$j]);
      $output .= "<input type=\"radio\" name=\"answer\" value=\"" . $aid . "\"> " . $answer . "<br>\n";
    }
    $output .= "</p>\n";
    $output .= "<p><input type=\"submit\" name=\"submit\" value=\"Stem\"></p>\n";
    $output .= "</form>\n";
}
Avatar billede ferrari_brian Nybegynder
06. september 2006 - 15:09 #2
Den bruger nogle generelle funktioner, som man kan bruge igen og igen... jeg har skrevet de 2 den bruger op her (SqlFetch og SqlPrintError) ... men der er også til connect (SqlConnect) og close (SqlClose) og så er der til at sende fx en insert,  update, delete eller andet (SqlRequest)
Avatar billede ferrari_brian Nybegynder
06. september 2006 - 15:10 #3
function SqlConnect()
{
  $Server = "";
  $User = "";
  $Pass = "";
  $Database = "";

  if (!mysql_connect("$Server","$User","$Pass"))
  {
    SqlPrintError("Could not connect to MySQL!");
  }

  if(!mysql_select_db("$Database"))
  {
    SqlPrintError("Could not select database: $Database");
  }
}

function SqlClose() {
  if(!mysql_close()) {
    SqlPrintError("Could not close connection to MySQL!");
  }
}


function SqlRequest($Query) {
  $Result = mysql_query($Query);

  if(!$Result) {
    SqlPrintError("Could not: <em>$Query</em>");
  }
}
Avatar billede ferrari_brian Nybegynder
06. september 2006 - 15:11 #4
Jeg glemte vist et id:

$QueryArray = SqlFetch("SELECT polls_questions.question, polls_questions.id, SUM(polls_answers.votes) AS votes FROM polls_questions LEFT JOIN polls_answers ON polls_questions.id = polls_answers.questions WHERE starts <= CURDATE() AND ends >= CURDATE()");
if(!empty($QueryArray))
{
  for ($i = 0; $i < sizeof($QueryArray); $i++)
  {
    extract($QueryArray[$i]);
    $output .= "<form action=\"http://" . $_SERVER["HTTP_HOST"] . "/afstemninger/\" method=\"post\">\n";
    $output .= "<p>" . $question . "";
    $output .= " (" . $votes . " stemmer)</p>\n";
    $output .= "<p>";
    $queryInner = SqlFetch("SELECT polls_answers.id AS aid, polls_answers.answer FROM polls_answers WHERE questions = '" . $id . "'");
    for ($j = 0; $j < sizeof($queryInner); $j++)
    {
      extract($queryInner[$j]);
      $output .= "<input type=\"radio\" name=\"answer\" value=\"" . $aid . "\"> " . $answer . "<br>\n";
    }
    $output .= "</p>\n";
    $output .= "<p><input type=\"submit\" name=\"submit\" value=\"Stem\"></p>\n";
    $output .= "</form>\n";
}
Avatar billede ferrari_brian Nybegynder
06. september 2006 - 15:42 #5
$QueryArray = SqlFetch("SELECT polls_questions.question, polls_questions.id, SUM(polls_answers.votes) AS votes FROM polls_questions LEFT JOIN polls_answers ON polls_questions.id = polls_answers.questions WHERE polls_questions.starts <= CURDATE() AND polls_questions.ends >= CURDATE()");
if(!empty($QueryArray))
{
  for ($i = 0; $i < sizeof($QueryArray); $i++)
  {
    extract($QueryArray[$i]);
    $output .= "<form action=\"http://" . $_SERVER["HTTP_HOST"] . "/afstemninger/\" method=\"post\">\n";
    $output .= "<p>" . $question . "";
    $output .= " (" . $votes . " stemmer)</p>\n";
    $output .= "<p>";
    $queryInner = SqlFetch("SELECT polls_answers.id AS aid, polls_answers.answer FROM polls_answers WHERE questions = '" . $id . "'");
    for ($j = 0; $j < sizeof($queryInner); $j++)
    {
      extract($queryInner[$j]);
      $output .= "<input type=\"radio\" name=\"answer\" value=\"" . $aid . "\"> " . $answer . "<br>\n";
    }
    $output .= "</p>\n";
    $output .= "<p><input type=\"submit\" name=\"submit\" value=\"Stem\"></p>\n";
    $output .= "</form>\n";
}
Avatar billede ferrari_brian Nybegynder
08. september 2006 - 10:00 #6
har du fået kigget på det?
Avatar billede henninghabor Nybegynder
08. september 2006 - 10:19 #7
Hej ferrari_brian,

Ja, jeg har kigget lidt på den sidste kommentar du skrev. Den virkede ikke pga. der mangler GROUP BY, så jeg skal ha' ændret i kaldet. Men der har lige været nogle andre ting jeg skulle kigge på først.

Ligger du et svar, hvis du vil ha' points?
Avatar billede ferrari_brian Nybegynder
08. september 2006 - 13:30 #8
takker... ellers må du lige sige til... undskyld jeg glemte group by...
Avatar billede henninghabor Nybegynder
09. september 2006 - 10:40 #9
Det er mig der takker for hjælpen :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester