You need to decide how the multiple keywords are connected. If someone types "keyword1 keyword2" in the search, are they looking for both keywords to be associated with the same photo (an AND operation) or are they looking for either keyword (or both) to be associated with the same photo (an OR operation). What about providing both? And what about "this keyword but not that other keyword", etc...
I'm not clear what the WordID column provides - other than expenditure of disk space. If you had a table with 'WordID, Word' as the columns, and the cross-reference table had 'PhotoID, WordID' columns, that makes one sensible design. Another sensible design has 'PhotoID, Word'. Having a table with 'WordID, PhotoID, Word' is not particularly sensible; it'll work, but the WordID column is effectively unused. You would need a unique constraint on the combination PhotoID, Word to ensure you don't have repetition in that table.
Given your @Words (temporary) table, you can do this to get the AND option:
SELECT P.PhotoID, P.Name, P.Title, P.Description
FROM Photo P, Word2Photo W
WHERE P.PhotoID = W.PhotoID
GROUP BY P.PhotoID, P.Name, P.Title, P.Description
HAVING COUNT(*) = (SELECT COUNT(*) FROM @Words L, Word2Photo M
WHERE M.Word = L.Word
AND M.PhotoID = P.PhotoID
)
It ensures that the number of entries in the Word2Photo table is the same as the number of entries in the @Words table for the given photo. It is a correlated sub-query; it is not efficient but it is effective. The useful thing is that the structure can be repeated mostly for the OR option:
SELECT P.PhotoID, P.Name, P.Title, P.Description
FROM Photo P, Word2Photo W
WHERE P.PhotoID = W.PhotoID
GROUP BY P.PhotoID, P.Name, P.Title, P.Description
HAVING 1 <= (SELECT COUNT(*) FROM @Words L, Word2Photo M
WHERE M.Word = L.Word
AND M.PhotoID = P.PhotoID
)
This looks for photos having at least one of the words in the list of words.
There probably are other ways to do it, but the symmetry is appealing. Clearly, if you get into more complex criteria (mixing AND and OR, or adding NOT), then the structure changes.
Caveat
Untested code.